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