我正在使用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进行交互。
只是为了澄清:这种方法到目前为止确实有效 - 我只是不确定它是否是正确的方式,或者是否有人可以看到我可能遇到的问题这种做法的东西。
答案 0 :(得分:3)
ElasticSearch不适合大规模的updating / deleting文档。
有many aproaches试图最大限度地减少对其体系结构的负面影响的过载,但如果认为这会增加解决方案的复杂性。
我建议你只在MySQL上保留CRUD操作,并使用ES作为仅附加。实际上,StackOverflow itself和许多其他伟大的TI公司都使用这种方法。
答案 1 :(得分:2)
使用Elasticsearch没有“正确的方法”。 “正确”是相对的,因此“正确的方式”是一种支持您的用例的方式。 Elasticsearch不仅适用于一个特定的用例,而且适用于越来越多的用例。
您描述的案例是完全有效的案例,即在ES中索引您在另一个RDBMS(例如MySQL)中拥有的任何内容,并确保索引内容与主要事实源同步。
您的用例中需要记住的一件难事是,您必须保证MySQL和ES始终是1:1同步,并且由于各种原因这不一定容易做到:
还有其他方法可以同步MySQL和ES,它们不那么脆弱,例如: by using the binlog
你需要问问自己这些问题并找出减轻这些潜在问题的策略,因为我可以向你保证他们(和其他人)肯定会出现。
总而言之,您的架构没有问题,成千上万的公司做同样的事情,但是,如果你的同步计划向南,你需要有一个计划。