天天看點

ElasticSearch應用篇-搜尋效果

一、叢集搜尋問題

1.問題:如何聚合多個節點或分片的資料生成傳回結果

在對Mysql進行分庫分表的時候,經常會遇到一個問題:如果查詢的資料分散在多張表中,因為涉及到組合多種表的資料,将會非常麻煩;對于有些分頁場景,更是一個災難,是以對Mysql分庫分表的時候經常會基于查詢次元來盡量避免跨表查詢的場景。

ElasticSearch也是分布式的,當資料分散與多個節點或者分片上時,他是如何解決資料聚合問題的呢?另外,搜尋基本都需要排序,如何解決排序問題呢?

2.ES整體流程

假設有N個分片,資料可能分散在這N個分片上,ES搜尋時,整體操作過程是:

  • S1: 用戶端将會同時向N個分片發起搜尋請求。
  • S2: 這N個分片基于本分片的内容獨立完成搜尋,然後将符合條件的結果全部傳回。
  • S3: 用戶端将傳回的結果進行重新排序和排名,最後傳回給使用者。

有經驗的開發很容易看出來,這裡有兩個問題:

  • 數量問題。假設每次傳回10條記錄,那麼這N個分片獨立執行查詢以後,每個分片最多都會傳回10條資料給用戶端,然後用戶端在進行排序傳回給使用者。這個過程中傳回的資料量(最大是10*N)會遠大于使用者請求需要的資料量。
  • 排名問題。計算分值使用的詞頻和文檔頻率等資訊都是基于自己分片的資料進行的,不同分片中這些資料不同,直接導緻各個分片算出來的分數不具有統一參考性,影響排名準确性。正确的做法是基于整體的詞頻、逆向文檔頻率等資訊來算分數。

3.查詢方式

ElasticSearch查詢的時候可以指定搜尋類型: QUERY_AND_FEATCH、QUERY_THEN_FETCH(預設的搜尋方式)、DFS_QUERY_THEN_FEATCH、DFS_QUERY_AND_FEATCH。

1)QUERY_AND_FEATCH**

向索引的所有分片(shard)都發出查詢請求,各分片傳回的時候把元素文檔(document)和計算後的排名資訊一起傳回。

這種搜尋方式是最快的,隻需要去shard查詢一次,但是各個shard傳回的結果的數量之和可能是使用者要求的size的n倍。

2)QUERY_THEN_FETCH

先向所有的shard送出請求,各分片隻傳回排序和排名相關的資訊(注意,不包括文檔document),然後按照各分片傳回的分數進行重新排序和排名,取前size個文檔;接着去相關的shard取document。

這種方式傳回的document與使用者要求的size是相等的。

3)DFS_QUERY_AND_FEATCH

在進行真正的查詢之前,先把各個分片的詞頻和文檔頻率收集一下,然後進行詞搜尋的時候,各分片依據全局的詞頻率和文檔頻率進行搜尋和排名。

接着按照QUERY_AND_FEATCH的方式查詢。

4)DFS_QUERY_THEN_FEATCH

和上面一種方式一樣,也是先收集詞頻和文檔頻率,然後再按照QUERY_THEN_FEATC的方式查詢。

這種查詢要前後互動三次,速度最慢,但是排名最準确。

二、相關度搜尋問題

1.問題:ES是如何将相關度高的内容能放在前面的?

在原理篇我們知道,當将一個文檔儲存到ElasticSearch會根據分詞的結果建立反向索引,這種結構是零散的,即每一個Term都會對應Posting List。查詢的時候也是先經過分詞,然後根據反向索引查詢。

這裡就有一個問題,ElasticSearch是如何将比對度最高的内容放在前面的?如下圖所示,比對效果最好的内容放到了傳回結果的最前面。

ElasticSearch應用篇-搜尋效果

2.相關度

Lucene 使用布爾模型(Boolean model)查找比對文檔,并使用權重來實作相關度搜尋。

1)布爾模型

就是在查詢中使用 AND、OR、NOT(即與或非)來比對文檔。

2)權重

權重由三個因素決定:詞頻、逆向文檔頻率、字段長度歸一值

  • 詞頻

    指的是詞在文檔中出現的頻度是多少,頻度越高,權重越高。

詞頻=該詞在文檔中出現次數的平方根。           
  • 逆向文檔頻率

    指的是詞在集合所有文檔裡出現的頻率是多少,頻次越高,權重越低。

逆向文檔頻率=索引中文檔數量除以所有包含該詞的文檔數,然後求其對數。           
  • 字段長度歸一值

    指的是字段的長度是多少,字段越短,字段的權重越高 。

字段長度歸一值 = 字段中詞數平方根的倒數。           

3)向量空間模型

通常我們都是搜尋多個字段,這樣就需要合并多詞權重,這個由向量空間模型實作。

具體合并過程基本都是數學上的算法,沒有詳細研究,有興趣的小夥伴可以到網上找一下。

3.相關度搜尋

ES其實就是基于相關度的算法來計算分數,将分數大的放在前面。

三、參考文檔

ElasticSearch之控制相關度原理講解:

https://www.cnblogs.com/wangshouchang/p/8667123.html

繼續閱讀