ES字段的附加属性有哪些?
es的每个字读除了指定数据类型(如text,keyword,long等)之外,还可以有一些其他属性,具体都有什么,作用分别是什么?
在Elasticsearch中,字段的附加属性主要包括以下几种:
- type:字段的数据类型,如text、keyword、date、long、double、boolean等。
- fields:多字段,用于对同一字段内容以不同方式进行索引。
- analyzer:分析器,用于全文搜索字段。
- search_analyzer:搜索分析器,用于全文搜索字段。
- normalizer:规范器,用于关键字字段。
- boost:提升因子,用于在查询时提升特定字段的相关性。
- coerce:强制转换,用于在索引时将字符串强制转换为数字。
- copy_to:复制到,用于在索引时将值复制到另一个字段。
- doc_values:文档值,用于排序、聚合等操作。
- dynamic:动态,用于控制新字段的添加。
- enabled:启用,用于控制字段是否被索引。
- fielddata:字段数据,用于在text字段上启用排序、聚合等操作。
- format:格式,用于日期字段。
- ignore_above:忽略以上,用于关键字字段,忽略过长的字段。
- ignore_malformed:忽略格式错误,用于数字和日期字段。
- index:索引,用于控制字段是否被索引。
- index_options:索引选项,用于控制索引的哪些部分应被存储。
- null_value:空值,用于替换空值。
- position_increment_gap:位置增量间隙,用于控制跨字段搜索的相关性。
- store:存储,用于控制字段的原始值是否被存储。
- term_vector:词向量,用于全文搜索字段。
doc_values和fielddata的区别?
- doc_values主要用于非文本类型的字段,如keyword、integer等,用于优化排序和聚合操作。默认情况下,doc_values是开启的(即值为true),这样可以对这些字段进行排序和聚合。如果你不需要对这些字段进行排序或聚合,可以将doc_values设置为false,这样可以节省存储空间,当然此时也就无法使用对应字段排序聚合。
- fielddata主要用于text类型的字段。默认情况下,text类型的字段的fielddata是关闭的(即值为false),因此不能对这些字段进行排序和聚合。如果你需要对text类型的字段进行排序或聚合,可以将fielddata设置为true,但请注意,这可能会占用大量内存,因此需要谨慎使用。
- 对于text类型的字段,无论doc_values设置为何值,都不会影响其排序和聚合的能力,因为text类型的字段不支持doc_values。同样,对于keyword、integer等非文本类型的字段,无论fielddata设置为何值,都不会影响其排序和聚合的能力,因为这些字段类型不支持fielddata。
如果一个text类型(默认fielddata=false)字段排序聚合,会抛出如下异常: Text fields are not optimised for operations that require per-document field data like aggregations and sorting,so these operations are disabled by default. Please use a keyword field instead. Alternatively,set fielddata=true on [name]in order to load field data by uninverting the inverted index. Note that this can use significant memory. 设置这个text类型字段的fielddata=true,即可解决这个异常
同样的,如果设置一个integer,keyword类型的字段的doc_values=false,然后对字段排序,会抛出如下异常(示例是给integer类型的age字段设置doc_values=false) Can't load fielddata on [age] because fielddata is unsupported on fields of type [integer]. Use doc values instead. 只需要对设置age字段的doc_values为true,或者去掉设置,即可解决异常
测试数据
DELETE doc_value_test
//"doc_values": false
//"fielddata": true
PUT doc_value_test
{
"mappings" : {
"properties" : {
"name" : {
"type" : "text"
},
"mobile" : {
"type" : "keyword"
},
"age" : {
"type" : "integer",
"doc_values": false
}
}
}
}
PUT doc_value_test/_doc/1
{
"name":"tom",
"mobile": "15978866921",
"age": 30
}
PUT doc_value_test/_doc/2
{
"name":"jerry",
"mobile": "15978866920",
"age": 35
}
PUT doc_value_test/_doc/3
{
"name":"jack",
"mobile": "15978866922",
"age": 20
}
POST doc_value_test/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
本文由 至简 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2023/10/20 10:14