2016-11-03 66 views
1

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

我的做法是在相应的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

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

你描述的情况是完全有效的,即在ES中索引你在另一个RDBMS如MySQL中拥有的任何内容,并确保索引内容与主要真实来源同步。

在您的使用情况下,你需要记住的一个困难的事情是,你必须要保证MySQL和ES总是1:1同步,而这并不容易因各种原因做:

  • 如果您需要将ES降低以进行维护,会发生什么情况,但是您的应用必须保持原因吗?
  • 如果ES中存在问题并且文档没有被索引/更新/删除,会发生什么情况? (请记住,没有事务支持)

还有其他方式可以同步MySQL和ES, by using the binlog

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

总而言之,您的架构没有问题,但成千上万的公司完全一样,但是,如果您的同步计划向南,您需要制定计划。

2

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

many aproaches尝试最大限度地减少它的体系结构的这种缺点的过载,但如果认为这会增加您的解决方案的复杂性。

我建议你只在MySQL上保留CRUD操作并使用ES作为append-only。实际上,StackOverflow itself以及其他很多TI公司都采用这种方法。