ElasticSearch | 排序 | Doc Values | Fielddata

排序

  • 默认情况下,ElasticSearch 会根据算分进行排序;
  • 可以使用 sort API 指定排序的规则

排序 | sort API | 举几个栗子

根据单字段排序
  • 使用了 sort API 之后,_score 的值就会变成 null;
POST /kibana_sample_data_ecommerce/_search
{
  "size": 5,
  "query": {
    "match_all": {

    }
  },
  "sort": [
    {"order_date": {"order": "desc"}}
  ]
}
根据多字段排序
POST /kibana_sample_data_ecommerce/_search
{
  "size": 5,
  "query": {
    "match_all": {

    }
  },
  "sort": [
    {"order_date": {"order": "desc"}},
    {"_doc":{"order": "asc"}},
    {"_score":{ "order": "desc"}}
  ]
}
对 text 类型的字段排序
  • 报错,需要开启 fielddata;
POST /kibana_sample_data_ecommerce/_search
{
  "size": 5,
  "query": {
    "match_all": {

    }
  },
  "sort": [
    {"customer_full_name": {"order": "desc"}}
  ]
}
  • 开启字段的 fielddata 就不报错了,可以随时打开,但是不建议打开,对全文本(text 类型)排序本身也没有很大的意义,只有在做一些 Aggregation 的时候,才把 fielddata 打开;
PUT kibana_sample_data_ecommerce/_mapping
{
  "properties": {
    "customer_full_name" : {
          "type" : "text",
          "fielddata": true,
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
  }
}

排序的过程

  • 排序是针对字段原始内容进行的,倒排索引无法发挥作用;
  • 需要用到正排索引,通过文档 id 和字段快速得到字段原始内容;
ElasticSearch 中两种实现排序的方式
  • Fielddata
  • Doc Valus(一种列式存储,对 Text 类型无效)

Doc Values vs Fielddata

 Doc ValuesField Data
何时创建索引时,和倒排索引一起创建搜索时动态创建
创建位置磁盘文件JVM Heap
优点避免大量内存占用索引速度快,不占用额外的磁盘空间
缺点降低索引速度,占用额外磁盘空间文档过多时,动态创建开销大,占用过多 JVM Heap
ES 默认采用ES 2.x 之后ES 1.x 及以前

关闭 Doc Values

ElasticSearch 2.x 开始默认的排序方式是 Doc Values,可以关掉;如果重新打开,需要重建索引;

PUT test_keyword
PUT test_keyword/_mapping
{
  "properties": {
    "user_name":{
      "type": "keyword",
      "doc_values":false
    }
  }
}
关闭 Doc Values 的好处
  • 增加索引的速度;
  • 减少磁盘空间;
什么时候关闭 Doc Values
  • 明确不需要做排序和聚合分析的时候;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值