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

回到顶部