ES字段附加属性

/ 默认分类 / 没有评论 / 236浏览

ES字段的附加属性有哪些?

es的每个字读除了指定数据类型(如text,keyword,long等)之外,还可以有一些其他属性,具体都有什么,作用分别是什么?

在Elasticsearch中,字段的附加属性主要包括以下几种:

  1. type:字段的数据类型,如text、keyword、date、long、double、boolean等。
  2. fields:多字段,用于对同一字段内容以不同方式进行索引。
  3. analyzer:分析器,用于全文搜索字段。
  4. search_analyzer:搜索分析器,用于全文搜索字段。
  5. normalizer:规范器,用于关键字字段。
  6. boost:提升因子,用于在查询时提升特定字段的相关性。
  7. coerce:强制转换,用于在索引时将字符串强制转换为数字。
  8. copy_to:复制到,用于在索引时将值复制到另一个字段。
  9. doc_values:文档值,用于排序、聚合等操作。
  10. dynamic:动态,用于控制新字段的添加。
  11. enabled:启用,用于控制字段是否被索引。
  12. fielddata:字段数据,用于在text字段上启用排序、聚合等操作。
  13. format:格式,用于日期字段。
  14. ignore_above:忽略以上,用于关键字字段,忽略过长的字段。
  15. ignore_malformed:忽略格式错误,用于数字和日期字段。
  16. index:索引,用于控制字段是否被索引。
  17. index_options:索引选项,用于控制索引的哪些部分应被存储。
  18. null_value:空值,用于替换空值。
  19. position_increment_gap:位置增量间隙,用于控制跨字段搜索的相关性。
  20. store:存储,用于控制字段的原始值是否被存储。
  21. term_vector:词向量,用于全文搜索字段。

doc_values和fielddata的区别?

  1. doc_values主要用于非文本类型的字段,如keyword、integer等,用于优化排序和聚合操作。默认情况下,doc_values是开启的(即值为true),这样可以对这些字段进行排序和聚合。如果你不需要对这些字段进行排序或聚合,可以将doc_values设置为false,这样可以节省存储空间,当然此时也就无法使用对应字段排序聚合。
  2. fielddata主要用于text类型的字段。默认情况下,text类型的字段的fielddata是关闭的(即值为false),因此不能对这些字段进行排序和聚合。如果你需要对text类型的字段进行排序或聚合,可以将fielddata设置为true,但请注意,这可能会占用大量内存,因此需要谨慎使用。
  3. 对于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"
      }
    }
  ]
}