原始数据
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 }