Elasticsearch-mapping

Mapping
  1. 概念:mapping就是ES数据字段field的type类型元数据,ES在创建索引的时候,动态映射(dynamic mapping) 会自动为不同的啥数据指定响应的mapping,mapping中包含了字段类型、搜索方式(精准匹配和全文检索)、分词器等。

  2. 查看mapping

    <pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="java" cid="n8" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background-color: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 0px; width: inherit; background-position: initial initial; background-repeat: initial initial;"> GET /product/_mapping
    {
    "product" : {
    "mappings" : {
    "properties" : {
    "desc" : {
    "type" : "text",
    "fields" : {
    "keyword" : {
    "type" : "keyword",
    "ignore_above" : 256
    }
    }
    },
    "name" : {
    "type" : "text",
    "fields" : {
    "keyword" : {
    "type" : "keyword",
    "ignore_above" : 256
    }
    }
    },
    "price" : {
    "type" : "long"
    },
    "tags" : {
    "type" : "text",
    "fields" : {
    "keyword" : {
    "type" : "keyword",
    "ignore_above" : 256
    }
    }
    }
    }
    }
    }
    }</pre>

  3. 搜索方式:

    • 精确匹配(exact value):在倒排索引过程中,分词器会将field作为一个整体创建到索引中。

    • 全文匹配(full text):分词、近义词、同义词、混淆词、大小写、词性、过滤、事态转换等

  4. 动态映射(dynamic mapping)

    • 常见类型转换:

      数据 类型
      "Elasticsearch" text/keyword
      123456 long
      123.123 double
      true/false boolean
      2020-04-12 date
    • 数字 123456 为何转为long?

      因为es的mapping_type是由JSON分析器检测数据类型,而JSON没有隐式类型转换(integer->long float->double),故dynamic mapping 会选择比较宽的数据类型。

    • 123.123 为何转为官网为double而实际为float?

      也许为es潜在bug。

ES数据类型
  1. 核心数据类型

    • 数字类型:

      1. long、integer、short、byte、double、float、half_float、scaled_float

      2. 在满足需求的情况下,尽可能选择方位小的数据类型。

      3. 浮点类型

        类型 取值范围
        double 64位双精度
        float 32位单精度
        half_float 16位半精度
        scaled_float 缩放类型的浮点数
      4. 对于float、half_float、scaled_float,-0.0和+0.0是不同的值,使用term查询查找-0.0不会匹配+0.0,同样range查询中上边界是-0.0不会匹配+0.0,下边界是+0.0不会匹配-0.0。

      5. 对于scaled_float,比如价格只需要精确到分,price为67.34的字段缩放因子为100,存起来就是5734.

      6. 有限考虑使用带缩放因子的scaled_float浮点类型。

    • 字符串

      1. keyword:适用于索引结构化的字段,可以用于过滤、聚合。keyword类型字段只能通过精确度(exact value)搜索到。Id应该用keyword。

      2. text:当一个字段是要被全文搜索,比如Email、内容、产品描述,这些字段应该使用text类型,设置text类型后,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项,text类型的字段不用于排序,很少用于聚合。

      3. 问何text不会创建索引? 字段数据会占用大量空间,尤其是在加载高基数text字段时,字段数据一旦加载到堆中,就在该字段生命周期内保存在哪里,同样,加载字段数据是一个昂贵的过程,可能导致用户遇到延迟问题。

      4. 在同一字段中同事具有全文本(text)和 关键字(keyword)版本会很有用,一个用于全文本搜索,另一个用于聚合和排序。

    • date(时间类型):精确查找(exact value)

    • boolean(布尔类型)

    • 二级制类型(binary)

    • 区间类型(range):integer_range、float_range、long_range、double_range、date_range。

  2. 复杂类型

    • Object:用于单个JSON对象

    • Nested:用于JSON对象数组

  3. 地理位置

    • Geo-point:纬度/经度积分

    • Geo-shape:用于多边形等复杂形状

  4. 特有类型:

    • IP地址:ip 用于IPv4和IPv6地址

    • Completion:提供自动完成建议

    • Tocken_count:计算字符串中令牌的数量

    • Murmur3:在索引时计算值的哈希并将其存储在索引中

    • Annotated-text:索引包含特殊标记的文本(通常用于标识命名实体)

    • Percolator:接受来自query-dsl的查询

    • Join:为同一索引内的文档定义父/子关系

    • Rank features:记录数字功能以提高查询时的点击率。

    • Dense vector:记录浮点值的密集向量。

    • Sparse vector:记录浮点值的稀疏向量。

    • Search-as-you-type:针对查询优化的文本字段,以实现按需输入的完成

    • Alias:为现有字段定义别名。

    • Flattened:允许将整个JSON对象索引为单个字段。

    • Shapeshape 对于任意笛卡尔几何。

    • Histogramhistogram 用于百分位数聚合的预聚合数值。

    • keyword当所有文档都具有相同值时的情况的 专业化。

  5. Array(数组):在Elasticsearch中,数组不需要专用的字段数据类型。默认情况下,任何字段都可以包含零个或多个值,但是,数组中的所有值都必须具有相同的数据类型。

  6. ES 7新增:

    • Date_nanos:date plus 纳秒
手工创建mapping fields的mapping只能创建,无法修改。
  1. 分词

    • 语法

      <pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="java" cid="n164" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background-color: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 0px; width: inherit; background-position: initial initial; background-repeat: initial initial;"> GET /_analyze
      {
      "analyzer": "standard"
      , "text": ["2020-05-20"]
      }</pre>

    • 动态映射(dynamic mapping)

      • 语法

        <pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="java" cid="n170" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background-color: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 0px; width: inherit; background-position: initial initial; background-repeat: initial initial;"> PUT /dm/_doc/1
        {
        "name": "xiaomi phone",
        "desc": "shouji zhong de zhandouji",
        "count": 123456,
        "price": 123.123,
        "date": "2020-05-20",
        "isdel": false,
        "tags": [
        "xingjiabi",
        "fashao",
        "buka"
        ]
        }</pre>

      • 查看映射

        <pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="java" cid="n173" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background-color: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 0px; width: inherit; background-position: initial initial; background-repeat: initial initial;"> {
        "dm" : {
        "mappings" : {
        "properties" : {
        "count" : {
        "type" : "long"
        },
        "date" : {
        "type" : "date"
        },
        "desc" : {
        "type" : "text",
        "fields" : {
        "keyword" : {
        "type" : "keyword",
        "ignore_above" : 256
        }
        }
        },
        "isdel" : {
        "type" : "boolean"
        },
        "name" : {
        "type" : "text",
        "fields" : {
        "keyword" : {
        "type" : "keyword",
        "ignore_above" : 256
        }
        }
        },
        "price" : {
        "type" : "float"
        },
        "tags" : {
        "type" : "text",
        "fields" : {
        "keyword" : {
        "type" : "keyword",
        "ignore_above" : 256
        }
        }
        }
        }
        }
        }
        }
        ​</pre>

      • *****正排索引(doc_values)、倒排索引(index)和fielddata*****

        • ****内存:doc_value 和 index 使用的是系统内存,fielddata使用的是jvm内存。****

        • ****设置index=false 则 无法进行搜索,_source值存在;设置doc_values=false 则 无法进行聚合;doc_values和index一旦设置,则无法修改,除非重建索引。如果不行重建索引而想聚合的话,只能设置field_data=true,以达到字段聚合目的。fielddata为聚合而生。****

        • ****优化:es官方建议,es是基于大量os cache来进行缓存以提高性能。不建议用jvm内存来进行缓存,jvm缓存会导致一定的gc开销和oom问题,给jvm更少内存,给os cache更大的内存。 比如64G服务器,给jvm最多4-16G内存(1/16~~1/4), os cache可以提高doc value和倒排索引的缓存、****

        • ****查询效率。****

      • mapping parameters

        • index:是否对创建当前字段创建索引,默认为true,如果不创建索引,该字段不会通过索引被搜索到,但是仍然会在_source元数据中展示。

        • analyzer:指定分析器。

        • boost:对当前字段相关度评分权重 ,默认为1。

        • coerce:是否允许强制类型转换。true:"1" 可以转为为 1;fasle:"1" 转为 1 是报错。

          <pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="java" cid="n185" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background-color: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 0px; width: inherit; background-position: initial initial; background-repeat: initial initial;"> DELETE coerce

          PUT coerce
          {
          "mappings": {
          "properties": {
          "number_one": {
          "type": "integer"
          },
          "number_two": {
          "type": "integer",
          "coerce": false
          }
          }
          }
          }

          PUT coerce/_doc/1
          {
          "number_one": "10"
          }

          拒绝,因为设置了false

          PUT coerce/_doc/2
          {
          "number_two": "10"
          }

          错误信息

          {
          "error" : {
          "root_cause" : [
          {
          "type" : "mapper_parsing_exception",
          "reason" : "failed to parse field [number_two] of type [integer] in document with id '2'. Preview of field's value: '10'"
          }
          ],
          "type" : "mapper_parsing_exception",
          "reason" : "failed to parse field [number_two] of type [integer] in document with id '2'. Preview of field's value: '10'",
          "caused_by" : {
          "type" : "illegal_argument_exception",
          "reason" : "Integer value passed as String"
          }
          },
          "status" : 400
          }

          整个mapping设置强制类型转换

          DELETE coerce

          PUT coerce
          {
          "settings": {
          "index.mapping.coerce": false
          },
          "mappings": {
          "properties": {
          "number_one": {
          "type": "integer",
          "coerce": true
          },
          "number_two": {
          "type": "integer"
          }
          }
          }
          }

          PUT coerce/_doc/1
          {
          "number_one": "10"
          }

          拒绝,因为设置了false

          PUT coerce/_doc/2
          {
          "number_two": "10"
          } </pre>

        • copy_to:ES就是内容拼接,放到一个新字段里,所以索引时间会增加,聚合性能取决于和之前的那个字段比较。

          <pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="java" cid="n189" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background-color: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 0px; width: inherit; background-position: initial initial; background-repeat: initial initial;"> DELETE copy_to

          PUT copy_to
          {
          "mappings": {
          "properties": {
          "field1": {
          "type": "text",
          "copy_to": "field_all"
          },
          "field2": {
          "type": "text",
          "copy_to": "field_all"
          },
          "field_all": {
          "type": "text"
          }
          }
          }
          }

          PUT copy_to/_doc/1
          {
          "field1": "field1",
          "field2": "field2"
          }

          GET copy_to/_search

          GET copy_to/_search
          {
          "query": {
          "match": {
          "field_all": {
          "query": "field1 field2"
          }
          }
          }
          }</pre>

        • doc_value:为了提升排序和聚合效率,默认为true,如果确定不需要对字段进行排序和聚合,也不需要通过脚本访问字段值,则可以禁用doc值,以节省磁盘空间(不支持text 和 annotated_text)

        • dynamic:控制是否可以动态添加新字段

          1. true:新检测到的字段将添加到映射中(默认)。

          2. false:新检测到的字段将被忽略。这些字段将不会被索引,因此将无法搜索,但仍会出现在_source返回的匹配项中,这些字段不会被添加到映射中,必须显示添加字段。

          3. strict:如果检测到新字段,则会引发异常,并拒绝文档,必须将新字段显示添加到映射中。

        • eager_global_ordinals:用于聚合的字段上,优化聚合性能。

          1. Frozen indices(冻结索引):有些索引使用率很高,会被保存在的内存中,有些使用率特别低,宁愿在使用的时候重新创建索引,在使用完毕丢弃数据,Frozen indices 的数据命中频率小,不适用与高搜索负载,数据不会被保存在内存中,堆空间占用比普通索引少得多,Frozen indices 是只是读的, 请求可能是秒级或者分钟级。

          2. eager_global_ordinals 不适用与Frozen indices

        • enable:是否创建倒排索引,可以对字段操作,也可以对索引操作,如果不创建索引,仍然可以检索并在_source元数据中展示,谨慎使用,该状态无法修改。

          <pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="java" cid="n211" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background-color: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 0px; width: inherit; background-position: initial initial; background-repeat: initial initial;"> // 操作索引
          PUT my_index
          {
          "mappings": {
          "enabled": false
          }
          }
          // 删除索引
          DELETE my_index
          // 操作字段
          PUT my_index
          {
          "mappings": {
          "properties": {
          "session_data": {
          "type": "object",
          "enabled": false
          }
          }
          }
          }</pre>

        • term_vector:

        • store:设置字段是否仅查询

        • similarity:为字段设置相关度算法,支持BM25、claassic(TF-IDF)、boolean。

        • ****search_analyzer:设置单独的查询分析器

          <pre spellcheck="false" class="md-fences mock-cm md-end-block md-fences-with-lineno" lang="java" cid="n266" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-color: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 8px; width: inherit; background-position: initial initial; background-repeat: initial initial;">**DELETE my_index

          PUT my_index
          {
          "settings": {
          "analysis": {
          "filter": {
          "autocomplete_filter": {
          "type": "edge_ngram",
          "min_gram": 1,
          "max_gram": 20
          }
          },
          "analyzer": {
          "autocomplete": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
          "lowercase",
          "autocomplete_filter"
          ]
          }
          }
          }
          },
          "mappings": {
          "properties": {
          "text": {
          "type": "text",
          "analyzer": "autocomplete",
          "search_analyzer": "standard"
          }
          }
          }
          }

          PUT my_index/_doc/1
          {
          "text": "Quick Brown Fox"
          }

          GET my_index/_search
          {
          "query": {
          "match": {
          "text": {
          "query": "Quick Br",
          "operator": "and"
          }
          }
          }
          }**</pre>

        • proterties:除了mapping还可用于object的属性设置

        • position_increment_gap:

        • null_value:为null值设置默认值。"null_value": "NULL"

        • norms:是否禁用评分(在filter和聚合字段上应该禁用)。

        • normalizer:

        • meta:附加元数据

        • Index_prefixes:前缀搜索

          1. min_chars:前缀最小长度,>0,默认2(包含)

          2. max_chars:前缀最大长度,<20,默认5(包含)

          3. 代码用例

            <pre spellcheck="false" class="md-fences mock-cm md-end-block md-fences-with-lineno" lang="java" cid="n251" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-color: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 8px; width: inherit; background-position: initial initial; background-repeat: initial initial;">PUT /my_index
            {
            "mappings": {
            "properties": {
            "number_one": {
            "type": "text",
            "index_prefixes": {
            "min_chars": 1,
            "max_chars": 10
            }
            }
            }
            }
            }
            </pre>

        • Index_phrases:提升exact_value查询速度,但是要消耗更多磁盘空间

        • index_options:控制将那些信息添加到反向索引中,以进行搜索和突出显示。仅用于text字段。 类型有:docsfreqspositionsoffsets

        • ignore_malformed:忽略类型错误

          <pre spellcheck="false" class="md-fences mock-cm md-end-block md-fences-with-lineno" lang="java" cid="n236" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-color: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 8px; width: inherit; background-position: initial initial; background-repeat: initial initial;">**DELETE my_index

          PUT /my_index
          {
          "mappings": {
          "properties": {
          "number_one": {
          "type": "integer",
          "ignore_malformed": true
          },
          "number_two": {
          "type": "integer"
          }
          }
          }
          }

          虽然有异常 但是不抛出

          PUT my_index/_doc/1
          {
          "text": "Some text value",
          "number_one": "foo"
          }

          GET /my_index/_search
          {
          "query": {
          "match_all": {}
          }
          }

          查询结果

          {
          "took" : 0,
          "timed_out" : false,
          "_shards" : {
          "total" : 1,
          "successful" : 1,
          "skipped" : 0,
          "failed" : 0
          },
          "hits" : {
          "total" : {
          "value" : 1,
          "relation" : "eq"
          },
          "max_score" : 1.0,
          "hits" : [
          {
          "_index" : "my_index",
          "_type" : "_doc",
          "_id" : "1",
          "_score" : 1.0,
          "_ignored" : [
          "number_one"
          ],
          "_source" : {
          "text" : "Some text value",
          "number_one" : "foo"
          }
          }
          ]
          }
          }

          数据格式不对

          PUT my_index/_doc/2
          {
          "text": "Some text value",
          "number_two": "foo"
          }

          错误输出

          {
          "error" : {
          "root_cause" : [
          {
          "type" : "mapper_parsing_exception",
          "reason" : "failed to parse field [number_two] of type [integer] in document with id '2'. Preview of field's value: 'foo'"
          }
          ],
          "type" : "mapper_parsing_exception",
          "reason" : "failed to parse field [number_two] of type [integer] in document with id '2'. Preview of field's value: 'foo'",
          "caused_by" : {
          "type" : "number_format_exception",
          "reason" : "For input string: "foo""
          }
          },
          "status" : 400
          }** </pre>

        • ****ignore_above:超过长度将被忽略

        • format:格式化

          <pre spellcheck="false" class="md-fences mock-cm md-end-block md-fences-with-lineno" lang="java" cid="n230" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-color: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 8px; width: inherit; background-position: initial initial; background-repeat: initial initial;">PUT /map
          {
          "mappings": {
          "properties": {
          "date":{
          "type": "date"
          , "format": ["yyyy-MM-dd"]
          }
          }
          }
          }
          </pre>

        • ****fields** :给field创建多字段,用于不同目的(全文检索或者聚合分析排序)。 比如text字段keyword。**

          <pre spellcheck="false" class="md-fences mock-cm md-end-block md-fences-with-lineno" lang="java" cid="n227" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-color: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 8px; width: inherit; background-position: initial initial; background-repeat: initial initial;">**DELETE fields_test

          给city创建一个keyword

          PUT fields_test
          {
          "mappings": {
          "properties": {
          "city": {
          "type": "text",
          "fields": {
          "raw": {
          "type": "keyword"
          }
          }
          }
          }
          }
          }

          PUT fields_test/_doc/1
          {
          "city": "New York"
          }

          PUT fields_test/_doc/2
          {
          "city": "York"
          }

          size = 0 表示不显示原始结果

          GET fields_test/_search
          {
          "query": {
          "match": {
          "city": "york"
          }
          },
          "size": 0,
          "sort": {
          "city.raw": "asc"
          },
          "aggs": {
          "Cities": {
          "terms": {
          "field": "city.raw"
          }
          }
          }
          }**</pre>

        • fielddata:

          1. 文本(text)字段使用查询时内存中的数据接口。但我们首次将该字段用于聚合、排序或者在脚本中使用时,将按需构建此数据结构,它是通过从磁盘读取每个字段的整个反向索引,翻转术语<->文档关系并将结果存储在JVM堆中的内存中来构建的。

          2. fielddata会占用大量堆空间,尤其是在加载大量的文本字段时。一旦将自担加载到堆中,它在该字段的生命周期将一直保留在哪里。同样,加载字段数据是一个昂贵的过程,可以导致用户遇到延迟的情况。这是默认情况禁用字段数据的原因。

          3. 聚合出错样例代码:

            <pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="java" cid="n221" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background-color: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 0px; width: inherit; background-position: initial initial; background-repeat: initial initial;"> DELETE my_index

            // 默认fielddata为false
            PUT myindex
            {
            "mappings": {
            "properties": {
            "address": {
            "type": "text"
            }
            }
            }
            }

            PUT myindex/_doc/1
            {
            "address": "New York"
            }
            // 聚合
            GET myindex/_search
            {
            "aggs": {
            "arrs_name": {
            "terms": {
            "field": "address"
            }
            }
            }
            }

            // 聚合出错,出错原因为
            {
            "error" : {
            "root_cause" : [
            {
            "type" : "illegal_argument_exception",
            "reason" : "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 [address] in order to load field data by uninverting the inverted index. Note that this can use significant memory."
            }
            ]
            }
            }</pre>

          4. text类型聚合类型(fielddata=true)

            <pre spellcheck="false" class="md-fences mock-cm md-end-block md-fences-with-lineno" lang="java" cid="n224" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-color: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 8px; width: inherit; background-position: initial initial; background-repeat: initial initial;">**DELETE myindex
            PUT myindex
            {
            "mappings": {
            "properties": {
            "address": {
            "type": "text",
            "fielddata": true
            }
            }
            }
            }

            PUT myindex/_doc/1
            {
            "address": "New York"
            }

            GET myindex/_search
            {
            "aggs": {
            "arrs_name": {
            "terms": {
            "field": "address"
            }
            }
            }
            }

            // 聚合结果
            {
            "took" : 2,
            "timed_out" : false,
            "_shards" : {
            "total" : 1,
            "successful" : 1,
            "skipped" : 0,
            "failed" : 0
            },
            "hits" : {
            "total" : {
            "value" : 1,
            "relation" : "eq"
            },
            "max_score" : 1.0,
            "hits" : [
            {
            "_index" : "myindex",
            "_type" : "_doc",
            "_id" : "1",
            "_score" : 1.0,
            "_source" : {
            "address" : "New York"
            }
            }
            ]
            },
            "aggregations" : {
            "arrs_name" : {
            "doc_count_error_upper_bound" : 0,
            "sum_other_doc_count" : 0,
            "buckets" : [
            {
            "key" : "new",
            "doc_count" : 1
            },
            {
            "key" : "york",
            "doc_count" : 1
            }
            ]
            }
            }
            }** </pre>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345