笔记三十五:排序及 Doc Values & Field Data

排序

  • ES 默认采用相关性算分对结果进行降序排序
  • 可以通过设置sorting参数,自行设定排序
  • 如果不指定_score,算分为null
POST /**/_search
{
    "size" : 5
    "query":{
        "match_all":{}
    },
    "sort":[
     {
        "order_data":{
            "order:"desc"
        }
     } 
    ]
}

多字段进行排序

  • 组合多个条件
  • 优先考虑写在前面的排序
  • 支持对相关性算分进行排序
POST /**/_search
{
    "size" : 5
    "query":{
        "match_all":{}
    },
    "sort":[
      {"order_data":{"order:"desc"    } },
      {"_doc":{"order:"asc"    } },
      {"_score":{"order:"desc"    } },
    ]
}

对Text 类型排序

POST /**/_search
{
    "size" : 5
    "query":{
        "match_all":{}
    },
    "sort":[
      {"text":{"order:"desc"    } },
    ]
}
//对 text 字段进行排序。默认会报错,需打开fielddata
PUT kibana_sample_data_ecommerce/_mapping
{
  "properties": {
    "customer_full_name" : {
          "type" : "text",
          "fielddata": true,
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
  }
}

排序的过程

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

Doc Values vs. Field Data

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

打开Fielddata

  • 默认关闭,可以通过Mapping设置打开。修改设置后,即时生效,无需缩减索引
  • 其他字段类型不支持,支持对Text进行设定
  • 打开后,可以对Text字段进行排序,但是结果无法满足预期,不建议使用
  • 部分情况下打开,满足一些聚合分析的特定需求

关闭Doc Values

  • 默认启动,可以通过Mapping 设置关闭
    • 增减索引速度/ 减少磁盘空间
  • 如果重新打开,需要重建索引
  • 什么时候需要关闭
    • 明确不需要做排序及聚合分析
      PUT test_keyword/_mapping
      {
      "properties": {
      "user_name":{
      "type": "keyword",
      "doc_values":false
      }
      }
      }

      获取Doc Values & Fielddata 中储存的内容

  • Text类型的不支持Doc Values
  • Text类型打开Fielddata后,可以查看分词后的数据
    DELETE temp_users
    PUT temp_users
    PUT temp_users/_mapping
    {
    "properties": {
      "name":{"type": "text","fielddata": true},
      "desc":{"type": "text","fielddata": true}
    }
    }
    

Post temp_users/_doc
{“name”:”Jack”,”desc”:”Jack is a good boy!”,”age”:10}

#打开fielddata 后,查看 docvalue_fields数据
POST temp_users/_search
{
“docvalue_fields”: [
“name”,”desc”
]
}

#查看整型字段的docvalues
POST temp_users/_search
{
“docvalue_fields”: [
“age”
]
}

# Fielddata Demo
- 对Text字段设置fielddata ,支持随时修改
- Doc Values 可以在Mapping 中关闭,但是需要重新索引
- Text 不支持Doc Values
- 使用docvalue_fields 查看存储的信息
- 
本作品采用《CC 协议》,转载必须注明作者和本文链接
快乐就是解决一个又一个的问题!
CrazyZard
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!