ElasticSearch7.3學習(二十五)----Doc value、query phase、fetch phase解析

|舊市拾荒| 發表於 2022-05-15
ElasticSearch

1、Doc value

搜尋的時候,要依靠倒排索引;

排序的時候,需要依靠正排索引,看到每個document的每個field,然後進行排序。

所謂的正排索引,其實就是doc values

在建立索引的時候,一方面會建立倒排索引,以供搜尋用;一方面會建立正排索引,也就是doc values,以供排序,聚合,過濾等操作使用,doc values是被儲存在磁碟上的,此時如果記憶體足夠,os會自動將其快取在記憶體中,效能還是會很高;如果記憶體不足夠,os會將其寫入磁碟上

1.1 倒排索引

doc1: hello world you and me

doc2: hi, world, how are you

term doc1 doc2
hello *  
world * *
you * *
and *  
me *  
hi   *
how   *
are   *

搜尋時:

hello you --> hello, you

hello --> doc1

you --> doc1,doc2

sort by 出現問題,如果需要自定義排序(按照某些欄位排序)那麼就會出現問題,因為倒排索引已經被分詞了。,此時就需要使用正排索引來進行分詞

1.2 正排索引

doc1: { "name": "jack", "age": 27 }

doc2: { "name": "tom", "age": 30 }

document name age
doc1 jack 27
doc2 tom 30

2、文件查詢

關於文件的查詢過程,前面部落格已經解析過了:ElasticSearch7.3學習(六)----文件(document)內部機制詳解

這裡再簡單的回顧一下。分為兩個步驟,第一query,第二fetch

2.1 query 

2.1.1 query phase

(1)搜尋請求傳送到某一個coordinate node,構構建一個priority queue,長度以paging操作from和size為準,預設為10

(2)coordinate node將請求轉發到所有shard,每個shard本地搜尋,並構建一個本地的priority queue

(3)各個shard將自己的priority queue返回給coordinate node,並構建一個全域性的priority queue

2.1.2 replica shard提升搜尋吞吐量

一次請求要打到所有shard的一個replica/primary上去,如果每個shard都有多個replica,那麼同時併發過來的搜尋請求可以同時打到其他的replica上去

2.2 fetch 

2.2.1 fetch phase

(1)coordinate node構建完priority queue之後,就傳送mget請求去所有shard上獲取對應的document

(2)各個shard將document返回給coordinate node

(3)coordinate node將合併後的document結果返回給client客戶端