elasticsearch index sorting ,索引排序

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"
      }
    }
  }
}

  1. sort.field 指明了排序字段
  2. 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支持以下设置

  1. index.sort.field
    用于排序的字段列表,字段类型必须是boolean, numeric, date ,keyword
  2. index.sort.order
    设置排序字段的顺序设置
    asc: 升序
    desc: 降序
  3. index.sort.mode
    min: Pick the lowest value.
    max: Pick the highest value.
  4. index.sort.missing
    对于排序字段为空的提供以下两种规则
    _last: 排序字段为空,放在排序的最后面.
    _first: 排序字段为空,放在排序的最前面.

查询

GET /events/_search
{
  "size": 10,
  "sort": [ 
      { "date": "desc" }
  ],
  "track_total_hits": false
}

注意

  1. track_total_hits 使用这个参数,es将不会返回总数,查到top10就返回
  2. 查询时候的排序要与索引排序一致

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.elastic.co/cn/blog/optimizing-sort-queries-in-elasticsearch-for-faster-results

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值