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 用于排序的字段集合。只可以配置类型为booleannumericdate 或 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个文档后直接返回。

 

posted @ 2022-03-05 16:23  qqfde  阅读(505)  评论(0编辑  收藏  举报