Elasticsearch官方文档翻译-索引排序
本系列文章翻译ES官方8.0版本文档。本章对应内容地址 Index Sorting
因为水平有限,翻译内容难免存在错漏,欢迎大家指出
索引排序
在es中创建索引时可以配置分块中段文件中数据的排序规则,默认情况下Lucene不会的存储的文档进行排序,可以通过index.sort.*配置项指定分段中文档的排序字段。
如下可指定通过单字段进行排序
PUT my-index-000001 { "settings": { "index": { "sort.field": "date", "sort.order": "desc" } }, "mappings": { "properties": { "date": { "type": "date" } } } }
上述配置指定了文档按date字段,逆序存储
也可以指定多个排序字段,如下
PUT my-index-000001 { "settings": { "index": { "sort.field": [ "username", "date" ], "sort.order": [ "asc", "desc" ] } }, "mappings": { "properties": { "username": { "type": "keyword", "doc_values": true }, "date": { "type": "date" } } } }
索引先按username正序排序,然后安装date逆序
索引排序有如下配置
- index.sort.field 用于排序的字段集合。只可以配置类型为
boolean
,numeric
,date
或keyword的doc_values
- index.sort.order 排序方式,asc正序,desc逆序
- index.sort.mode 索引排序支持使用多值字段,这个配置项控制选择哪个值进行排序。min:选择最小值排序;max:选择最大值排序
- index.sort.missing 该配置项决定缺少排序字段的文档存储顺序。_last:缺少字段的文档排在最后;_first:缺少字段的文档排在最前
提前响应请求
默认情况下es会遍历所有满足条件的文档,并根据请求的排序字段返回排名靠前的文档。如果索引排序与请求中的排序字段一致,那么就可以减少每个分段访问的文件数量,只需要访问分段中前N个文档即可。比如说,我们有一个索引其存储时按一个timestamp的字段排序,如下
PUT events { "settings": { "index": { "sort.field": "timestamp", "sort.order": "desc" } }, "mappings": { "properties": { "timestamp": { "type": "date" } } } }
通过如下请求查询
GET /events/_search { "size": 10, "sort": [ { "timestamp": "desc" } ] }
es会检测到在分段文件中文档已经按照该字段进行了逆序存储,因此只需遍历每个分段的前N个文档。同时会对满足条件的其他文档进行数量计算。
如果你只是需要查看最后的10个文档数据,而不需要总数,那么只需要在查询条件中设置track_total_hits参数为false,如下
GET /events/_search { "size": 10, "sort": [ { "timestamp": "desc" } ], "track_total_hits": false }
在这种情况下,es就会在遍历了前N个文档后直接返回。