一尘不染

MySQL的ElasticSearch用法

elasticsearch

我正在使用ElasticSearch作为网站的搜索组件。被索引并最终被搜索的数据与保存在MySQL DB中的数据相同。

我的解决方法是在发生相应的CRUD MySQL操作时在索引中添加/删除/修改数据。

例如,创建操作如下所示:

public function savePost(Request $request) {
    //Firstly, create the object and save it to MySQL
    $post = new Post();
    $post->title = $request->title;
    $post->body = $request->body;
    //...
    //and so on
    $post->save();

    //Secondly, index this new data:
    $elasticSearchClient = ClientBuilder::create()->build();

    $params = [
        'index' => 'some_index_elasticsearch',
        'id' =>  $post->id,
        'type' => 'post',
        'timestamp' => time(),
        'body' => [
            'id' => $post->id,
            'title' => $post->title,
            'body' => $post->body,
            //... and so on
        ],
    ];

    $elasticSearchClient->index($params);

}

如果数据是在MySQL中删除/更新的,那么我将其删除或从索引中更新。

这是将MySQL与ElasticSearch(或其他任何类似的技术,例如Sphinx)结合使用的正确方法吗?还是建议使用更好的方法将MySQL用作ElasticSearch的更多数据源?(这实际上根本没有发生,因为ElasticSearch和MySQL之间根本没有交互)。

我正在使用https://github.com/elastic/elasticsearch-
php与ElasticSearch进行交互,如果有什么不同的话。

需要澄清的是:这种方法到目前为止仍然有效-我不确定这是否是 正确的 方法,或者不确定是否有人可以看到这种方法可能会遇到的问题。


阅读 416

收藏
2020-06-22

共1个答案

一尘不染

没有使用Elasticsearch的“正确方法”。“正确”是相对的,因此“正确方法”是支持您的用例的一种方法。Elasticsearch不仅适用于一种特定的用例,而且适用于越来越多的一种用例。

您所描述的情况是一种非常有效的情况,即在ES中为您在另一个RDBMS(如MySQL)中拥有的任何内容编制索引,并确保被索引的内容与主要事实来源同步。

您需要牢记的用例中的一件困难事情是,您必须保证MySQL和ES始终保持1:1同步,由于各种原因,这不一定很容易做到:

  • 如果您需要关闭ES进行维护,但由于任何原因您的应用程序必须保持正常运行,会发生什么情况?
  • 如果ES中存在问题并且文档没有被索引/更新/删除,该怎么办?(请记住没有交易支持)

您需要问自己这些问题,并找出缓解这些潜在问题的策略,因为我可以向您保证它们(和其他问题)肯定会出现。

综上所述,您的体系结构没有问题,成千上万的公司都在做同样的事情,但是,如果您的同步计划向南,则需要制定一个计划。

2020-06-22