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