我正在使用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进行交互,如果有什么不同的话。
需要澄清的是:这种方法到目前为止仍然有效-我不确定这是否是 正确的 方法,或者不确定是否有人可以看到这种方法可能会遇到的问题。
没有使用Elasticsearch的“正确方法”。“正确”是相对的,因此“正确方法”是支持您的用例的一种方法。Elasticsearch不仅适用于一种特定的用例,而且适用于越来越多的一种用例。
您所描述的情况是一种非常有效的情况,即在ES中为您在另一个RDBMS(如MySQL)中拥有的任何内容编制索引,并确保被索引的内容与主要事实来源同步。
您需要牢记的用例中的一件困难事情是,您必须保证MySQL和ES始终保持1:1同步,由于各种原因,这不一定很容易做到:
您需要问自己这些问题,并找出缓解这些潜在问题的策略,因为我可以向您保证它们(和其他问题)肯定会出现。
综上所述,您的体系结构没有问题,成千上万的公司都在做同样的事情,但是,如果您的同步计划向南,则需要制定一个计划。