笔记三十五:排序及 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 设置关闭
- 增减索引速度/ 减少磁盘空间
- 如果重新打开,需要重建索引
- 什么时候需要关闭
- 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 协议》,转载必须注明作者和本文链接