ElasticSearch与MySQL的使用

时间:2016-11-03 20:45:31

标签: php mysql 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进行交互。

只是为了澄清:这种方法到目前为止确实有效 - 我只是不确定它是否是正确的方式,或者是否有人可以看到我可能遇到的问题这种做法的东西。

2 个答案:

答案 0 :(得分:3)

ElasticSearch不适合大规模的updating / deleting文档。

many aproaches试图最大限度地减少对其体系结构的负面影响的过载,但如果认为这会增加解决方案的复杂性。

我建议你只在MySQL上保留CRUD操作,并使用ES作为仅附加。实际上,StackOverflow itself和许多其他伟大的TI公司都使用这种方法。

答案 1 :(得分:2)

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

您描述的案例是完全有效的案例,即在ES中索引您在另一个RDBMS(例如MySQL)中拥有的任何内容,并确保索引内容与主要事实源同步。

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

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

还有其他方法可以同步MySQL和ES,它们不那么脆弱,例如: by using the binlog

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

总而言之,您的架构没有问题,成千上万的公司做同样的事情,但是,如果你的同步计划向南,你需要有一个计划。