ES查詢流程圖解與思考

1.ES有那些搜索方式?

Elasticsearch的搜索類型(SearchType類型)

1、 query and fetch
  向索引的所有分片 ( shard)都發出查詢請求, 各分片返回的時候把元素文檔 ( document)和計算後的排名信息一起返回。
  這種搜索方式是最快的。 因爲相比下面的幾種搜索方式, 這種查詢方法只需要去 shard查詢一次。 但是各個 shard 返回的結果的數量之和可能是用戶要求的 size 的 n 倍。
  優點:這種搜索方式是最快的。因爲相比後面的幾種es的搜索方式,這種查詢方法只需要去shard查詢一次。
  缺點:返回的數據量不準確, 可能返回(N*分片數量)的數據並且數據排名也不準確,同時各個shard返回的結果的數量之和可能是用戶要求的size的n倍。

 

2、 query then fetch(es 默認的搜索方式)
  如果你搜索時, 沒有指定搜索方式, 就是使用的這種搜索方式。 這種搜索方式, 大概分兩個步驟:
  第一步, 先向所有的 shard 發出請求, 各分片只返回文檔 id(注意, 不包括文檔 document)和排名相關的信息(也就是文檔對應的分值), 然後按照各分片返回的文檔的分數進行重新排序和排名, 取前 size 個文檔。
  第二步, 根據文檔 id 去相關的 shard 取 document。 這種方式返回的 document 數量與用戶要求的大小是相等的。
  優點:返回的數據量是準確的。
  缺點:性能一般,並且數據排名不準確。
 

3、 DFS query and fetch
  這種方式比第一種方式多了一個 DFS 步驟,可以更精確控制搜索打分和排名。也就是在進行查詢之前,先對所有分片發送請求, 把所有分片中的詞頻和文檔頻率等打分依據全部彙總到一塊,再執行後面的操作。
  優點:數據排名準確
  缺點:
    性能一般
    返回的數據量不準確, 可能返回(N*分片數量)的數據

 

4、 DFS query then fetch
  比第 2 種方式多了一個 DFS 步驟。
  也就是在進行查詢之前, 先對所有分片發送請求, 把所有分片中的詞頻和文檔頻率等打分依據全部彙總到一塊, 再執行後面的操作、

  優點
    返回的數據量是準確的
    數據排名準確
  缺點
    性能最差【 這個最差只是表示在這四種查詢方式中性能最慢, 也不至於不能忍受,如果對查詢性能要求不是非常高, 而對查詢準確度要求比較高的時候可以考慮這個】
 

 

2.DFS 是一個什麼樣的過程?
  

      DFS 其實就是在進行真正的查詢之前, 先把各個分片的詞頻率和文檔頻率收集一下, 然後進行詞搜索的時候, 各分片依據全局的詞頻率和文檔頻率進行搜索和排名。 顯然如果使用 DFS_QUERY_THEN_FETCH 這種查詢方式, 效率是最低的,因爲一個搜索, 可能要請求 3 次分片。 但, 使用 DFS 方法, 搜索精度是最高的。

 

3.性能方面總結一下?

從性能考慮 QUERY_AND_FETCH 是最快的DFS_QUERY_THEN_FETCH 是最慢的

從搜索的準確度來說, DFS 要比非 DFS 的準確度更高。

 

4.權衡問題思考?根據不同的需求--->定製化選擇

1.ES的分片機制天生支持分佈式,同時也帶來了分佈式了弊端:排序和算分問題;

想要精確的算分和排序--->需要大量的計算

2.kafka與ES面臨相同的問題:kafka的單個分區內可以保證順序性,分區之間是不能保證順序性的

3.搜索的場景需要嚴格的定製化,通過對mapping的修改可以支持算分的調整,影響查詢的結果-----代價是大大增加開發和mapping的維護成本

4.分佈式的系統中路由算法的弊端:增加/刪除節點時會有路由錯誤的問題(引發類似於緩存雪崩的場景)

對應的解決方案:如redis的一致性hash算法

ES同樣面臨類似的場景:每個index的主分片設置策略,動態分配會有大量的數據遷移,分配不合理又會影響性能

對此,ES的解決方案是:index建立好之後不允重新設置分片,需要重新設置需要reindex
 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章