跳到主要内容

ES Mapping

概念和用法

Mapping定义了ES的索引结构、字段类型、分词器等属性

Mapping类似于“表结构”,但有所不同,如分词器、评分、一个字段可以有多个类型等。

# 查看有哪些索引
GET _cat/indices?v

# 查看索引的mapping
GET <index>/_mapping

# 查看指定字段的mapping
GET <index>/_mapping/field/<field>

字段的数据类型

  1. 数字类型
  2. 基本数据类型:binarybooleanalias
  3. keywords类型
    • keyword 类型★:是用于索引结构化的字段,可以用于过滤、排序、聚合。keyword 类型的字段只能通过精确值搜索。
    • constant_keyword :始终包含相同的关键字字段
    • wildcard :可针对类似grep
  4. Dates类型
    • date :JSON没有日期数据类型,因此ES中的日期可以是:
      • 包含格式化日期的字符串
      • 时间戳
    • date_nanos :纳秒,支持的日期范围:1970~2262年
  5. 对象类型
    • object 类型:非基本数据类型之外,默认的json对象为object类型
    • flattened :单映射对象类型,其值是json对象
    • nested ★:嵌套类型
    • join :父子级关系类型
  6. 空间数据类型
    • geo_point :纬度和经度点
    • geo_shape :复杂的形状,例如多边形
    • point :任意笛卡尔点
    • shape :任意笛卡尔几何
  7. 文档排名类型
    • dense_vector :记录浮点值的密集向量
    • rank_feature :记录数字特征以提高查询时的命中率
    • rank_features :记录数字特征以提高查询时的命中率
  8. 文本搜索类型
    • text ★:文本类型。可分词类型,用以支持全文检索
    • annotated-text :包含特殊文本标记,用于标识命名实体
    • completion ★:用于自动补全,即搜索推荐
    • search_as_you_type :类似文本的字段,经过优化 为提供按类型完成的查询提供现成支持 用例
    • token_count :文本中的标记计数

常见的映射参数

index :当前字段是否创建倒排索引,默认true

analyzer:指定分词器

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

coerce :是否允许强制类型转换

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

dynamic :控制是否可以动态添加新字段。true:新检测到的字段将添加到映射中(默认)。false :新检测到的字段将被忽略,这些字段不会被索引,因此将无法搜索,但仍会出现在_source 返回的匹配项中,这些字段不会添加到映射中,必须显式添加新字段。

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

eager_global_ordinals :用于聚合的字段上,优化聚合性能,但不适用于frozen indicesfrozen indices (冻结索引)的数据命中频率小,数据不会被保存在内存中,堆空间占用比普通索引少得多。冻结索引是只读的,请求可能是秒级或分钟级。

enable :是否创建倒排索引,可以对字段操作,也可以对索引操作。

fielddata :查询时内存数据结构,在首次用当前字段聚合、排序或者在脚本中使用时,需要字段为fielddata 数据结构,并且创建倒排索引保存到堆中。

fields :给field创建多字段,用于不同目的

format :格式化

ignore_above :超过长度将被忽略

ignore_malformed :忽略类型错误

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

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

index_prefixes :前缀搜索。min_chars:前缀最小长度,max_chars :前缀最大长度

meta :附加元数据

normalizer

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

null_value :为null设置默认值

position_increment_gap :用于match_phrase 跨值查询

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

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

similarity :为字段设置相关度算法

store :设置字段是否仅查询

term_vector :运维参数

两种映射类型

自动映射 Dynamic field mapping

field typedynamic
true/falseboolean
小数float
整数long
objectobject
数组取决于数组中的第一个非空元素的类型
日期格式字符串date
数字类型字符串float/long
其它字符串text+keyword

显式映射 Explicit field mapping

PUT test_mapping
{
"mappings": {
"properties": {
"title": {
"type": "text"
},
"name": {
"type": "text",
"fields": {
"key": {
"type": "keyword"
}
}
},
"age": {
"type": "integer"
}
}
}
}

Text和Keyword类型

Text类型

text类型在生成倒排索引前会进行分词,用于全文搜索。text类型不用于排序,很少用于聚合。

注意事项:

  • 适用于全文检索,如match 查询
  • text 字段会被分词
  • 默认情况下会创建倒排索引
  • 自动映射器会为text 类型创建keyword 字段

Keyword类型

keyword类型适用于不分词的字段。如数字类型不用于范围查找,用keyword性能要高于数值类型。

当使用keyword类型查询时,其字段值会被作为一个整体,并保留字段值的原始属性。

注意事项:

  • keyword不会对文本分词,会保留字段的原有属性,包括大小写等。
  • keyword仅是字段类型,不会对搜索词产生任何影响。
  • keyword一般用于需要精确查找的字段,或者聚合排序字段。
  • keyword通常和term搜索一起用。
  • keyword字段的ignore_above参数代表其截断长度,默认256。如果超出长度,字段值会被忽略而不是截断。

映射模板

如果希望对符合某类要求的特定字段制定映射,就需要用到映射模板dynamic template。映射模板有时候也被称作:自动映射模板,动态映射模板等。

基本语法:

{
"dynamic_templates": [
{
"template_name": {
... match conditions ...
"mapping": { ... }
}
},
]
...
}

Conditions参数:

  • match_mapping_type:主要用于对数据类型的匹配。
  • matchunmatch:用于对字段名称的匹配。

案例:

PUT test_dynamic_template
{
"mappings": {
"dynamic_templates": [
{
"integers": {
"match_mapping_type": "long",
"mapping": {
"type": "integer"
}
}
},
{
"num_as_keyword": {
"match_mapping_type": "string",
"match": "num_*",
"unmatch": "*_text",
"mapping": {
"type": "keyword"
}
}
}
]
}
}

以上代码会产生以下效果:

  • 所有long类型字段会默认映射为integer
  • 所有文本字段如果是以num_开头,并且不以_text结尾,会自动映射为keyword类型