es默认的搜索排序是_score,通过评分排序,但是对于大数据量,评分一致的情况下也还是会乱序,官方说可以使用_doc,但是这个索引插入顺序是按照分片存的,也就是为2 的顺序可能多个分片都存在。所以实测并不好用。博主在做大数据量的排序时候,使用datatime字段排序,解决了乱序问题。
本文我想使用另外的解决方案,解决这个使用
index sorting
在Elasticsearch中创建新索引时,可以配置每个Shard中的分段如何排序。默认情况下,Lucene不提供任何排序。index.sort.*设置定义了哪些字段应该用于每个段中的文档排序。
如下我们提供了一个单一字段排序
PUT my-index-000001
{
"settings": {
"index": {
"sort.field": "date",
"sort.order": "desc"
}
},
"mappings": {
"properties": {
"date": {
"type": "date"
}
}
}
}
- sort.field 指明了排序字段
- sort.order 指明了排序顺序
多字段排序
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"
}
}
}
}
Index sorting支持以下设置
- index.sort.field
用于排序的字段列表,字段类型必须是boolean, numeric, date ,keyword - index.sort.order
设置排序字段的顺序设置
asc: 升序
desc: 降序 - index.sort.mode
min: Pick the lowest value.
max: Pick the highest value. - index.sort.missing
对于排序字段为空的提供以下两种规则
_last: 排序字段为空,放在排序的最后面.
_first: 排序字段为空,放在排序的最前面.
查询
GET /events/_search
{
"size": 10,
"sort": [
{ "date": "desc" }
],
"track_total_hits": false
}
注意
- track_total_hits 使用这个参数,es将不会返回总数,查到top10就返回
- 查询时候的排序要与索引排序一致
https://discuss.elastic.co/t/too-large-data-for-id/179500
https://scsundefined.gitbooks.io/elasticsearch-reference-cn/content/s06/03_03_sort.html
https://discuss.elastic.co/t/does-it-make-sense-to-add-timestamp-in-index-sorting/286551文章来源:https://www.toymoban.com/news/detail-764932.html
https://www.elastic.co/cn/blog/optimizing-sort-queries-in-elasticsearch-for-faster-results文章来源地址https://www.toymoban.com/news/detail-764932.html
到了这里,关于elasticsearch index sorting ,索引排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!