欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Elasticsearch 之 Mappings

程序员文章站 2024-03-02 20:36:46
...

映射(Mapping)

映射是用来定义一个文档,和其包含的字段,是如何存储和索引的过程。举例来说,使用映射可以定义:

  • 哪一个字符串字段应该看作全文索引字段;
  • 哪一个字段包含数字,日期,或者地理定位;
  • 是否文档中所有字段的值都该被索引到 _all 字段中;
  • 日期字段值的格式;
  • 自定义的规则控制是否动态添加索引 (附1)

映射类型(Mapping Type)

每个索引都有一份映射类型决定了文档如何被索引。

一个映射类型有:

Meta-fields

  • 元字段用于定制如何处理文档的相关元数据。元字段包括 _index_type_id_source

Fields or properties

  • 一份映射类型包含字段列表或者文档的相关属性。

字段数据类型

每个字段有一种数据类型:

  • 检点类型包括:text、keyword、date、long、double、boolean、ip;
  • 支持 json 层级结构的类型 object 或者 nested。
  • 特殊类型如 geo_point、geo_shape、completion。

为了不同的目的而用不同的方法索引同样的字段是很常见的。举例来说,一个 string 字段可以设置为 text 达到全文索引的目的,或者设置为 keyword 用来排序或者聚合。以上的两种情况任选一个,在分词的情况下,可以给一个字符串字段使用 standard analyzerenglish analyzerfrench analyzer 等分词器。

这就是多字段的目的。大部分数据类型通过字段参数支持多字段。

防止映射激增的设置

在一个索引中定义太多字段是一种可能导致映射爆炸的情况,这可能导致内存不足错误和难以恢复的情况。这个问题可能比预期的更加常见。例如,考虑如下的情况,每个新增加的文档都引入了新的字段。这在动态映射的设置下是很常见的。每次文档包含的新字段都会最终添加到索引的映射中。对于数据集小的情况并没有什么问题,但是如果映射的集持续增长就会产生问题。以下的设置允许你可以限制字段映射的数量,不管是手动还是自动创建的,为了预防糟糕的文档导致映射激增:

index.mapping.total_fields.limit

索引的最大字段数量。默认值 1000。

index.mapping.depth.limit

字段最大深度,用来衡量内部对象的数量。例如,如果所有的字段都定义在根对象的同一级,那么深度就是 1。如果有一个对象映射,那么深度就是 2,以此类推。默认值 20。

index.mapping.nested_fields.limit

在一个索引中 nested 字段的最大数量默认为 50。索引一个拥有 100 个嵌套字段的文档实际上索引了 101 个文档,因为每个嵌套文档都会被索引为一个独立的隐藏文档。

动态映射(Dynamic mapping)

字段和映射类型在使用前不需要定义。多亏了 dynamic mapping,新的字段名称会自动添加,并被索引。新的字段既可以添加到顶层的映射类型,也可以添加到 objectnested 字段的内部。

显式映射(Explicit mappings)

尽管动态映射在刚开始学习的时候很方便,但是在你比 Elasticsearch 的猜测更了解数据的情况下,指定自己的显示映射更合适。

更新存在的字段映射

除了记录的地方,已经存在的字段映射无法更新。更改映射将意味着使已经存在索引的文档无效。相反,你应该创建一个具有正确映射的新索引,并将数据 重新索引(reindex) 到该索引中。如果您只想重命名字段而不更改其映射,可以使用 别名字段 实现。

举例

当创建索引的时候即可以指定映射,如下:

PUT my_index 
{
  "mappings": {
    "_doc": { 
      "properties": { 
        "title":    { "type": "text"  }, 
        "name":     { "type": "text"  }, 
        "age":      { "type": "integer" },  
        "created":  {
          "type":   "date", 
          "format": "strict_date_optional_time||epoch_millis"
        }
      }
    }
  }
}
curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d'
{
  "mappings": {
    "_doc": { 
      "properties": { 
        "title":    { "type": "text"  }, 
        "name":     { "type": "text"  }, 
        "age":      { "type": "integer" },  
        "created":  {
          "type":   "date", 
          "format": "strict_date_optional_time||epoch_millis"
        }
      }
    }
  }
}
'

附录

附1

动态映射

Elasticsearch 最重要的特性特性之一方便上手,让你很快的让你的数据投入使用。为了索引一个文档,你不必走创建索引,定义映射类型,然后定义字段----索引一个文档,然后索引,映射,字段就会自动创建:

PUT data/_doc/1 
{ "count": 5 }
curl -X PUT "localhost:9200/data/_doc/1" -H 'Content-Type: application/json' -d'
{ "count": 5 }
'

注:上面创建了 data 索引,映射类型 _doc,以及字段 count,数据类型为 long。

新字段的自动检测和添加称为动态映射。动态映射规则可以通过以下方式定制,以满足具体的目的:

  1. 动态字段映射:(控制动态字段检测的规则)
  2. 动态模版:(为动态添加的字段配置映射的自定义规则)

注: 索引模版在不管是动态创建,还是显示创建,都允许你配置默认的映射、设置、新索引的别名。
翻译自:

  1. https://www.elastic.co/guide/en/elasticsearch/reference/6.4/mapping.html
  2. https://www.elastic.co/guide/en/elasticsearch/reference/6.4/dynamic-mapping.html