2016-11-03 67 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公司都採用這種方法。