原始數據
id | username | grade | description |
1 | ahua | 87 | i like? study |
2 | xiaowang | 92 | i like? es |
3 | zhaoyun | 63 | i like? java |
倒排索引
description使用的text分詞,使用倒排索引
term | id |
i | 1,2,3 |
like | 1,2,3 |
study | 1 |
es | 2 |
java | 3 |
分詞后,如果匹配 es,則需要逐行匹配,時間復雜度O(N),將term的此項按照字典順序排序,通過二分查找將時間復雜度優化到O(lgN)
列式存儲
字段 | Doc Values 存儲內容(列式) |
---|---|
id | [1, 2, 3] |
username | ["ahua", "xiaowang", "zhaoyun"] |
grade | [87, 92, 63] |
排序流程:
步驟 1:讀取?grade
?的 Doc Values
Elasticsearch 直接從列式存儲中加載?grade
?的值和對應的文檔 ID(_id
):
grade: [87, 92, 63]
_id: [1, 2, 3]
步驟 2:構建 (grade, _id) 對
將?
grade
?和?_id
?組合成可排序的鍵值對:
? [(87, 1), (92, 2), (63, 3)]
步驟 3:排序(升序為例)
對鍵值對按?
grade
?升序排序:
[(63, 3), (87, 1), (92, 2)]
步驟 4:按排序結果獲取文檔
根據排序后的?
_id
?順序,從?_source
?中獲取完整文檔:
_id=3
?→?{ "username": "zhaoyun", "grade": 63 }
_id=1
?→?{ "username": "ahua", "grade": 87 }
_id=2
?→?{ "username": "xiaowang", "grade": 92 }