字段类型按family分组。同一族中的类型具有完全相同的搜索行为,但可能具有不同的空间使用或性能特征。
目前,除了字符串有两种family类型:keyword
和 text
。 其他类型系列只有一个字段类型, 例如boolean
类型族由一种字段类型组成:boolean
。
常见类型
-
binary
编码为 Base64 字符串的二进制值。 该字段默认 不存储到索引 且 不可搜索。参数 意义 doc_values 该字段是否应该以列的方式存储在磁盘上,以便以后可以用于排序、聚合或脚本?默认为 false
。store 字段值是否应与字段 _source
分开存储和检索。接受true
或false
(默认)。参数讲解:
-
doc_values
: 倒排索引这种数据结构并不适合用作聚合,排序,在脚本里访问字段等等这些场景,于是 doc_values 数据结构应运而生。 doc_values 为 true 时,es同时会以列的方式保存一份数据用作聚合,排序。
binary数据类型使用:
PUT my-index-000001 { "mappings": { "properties": { "blob": { "type": "binary", "doc_values": false, "store": false } } } }
-
-
boolean
true 或者 false参数 意义 doc_values 该字段是否应该以列的方式存储在磁盘上,以便以后可以用于排序、聚合或脚本?默认为 false
。index 该字段是否应该可以快速搜索?接受 true
(默认)和false
. 仅doc_values
启用的字段仍然可以使用基于术语或范围的查询进行查询,尽管速度较慢。null_value 当文档中该字段为空时,这个值会当作默认值填充到字段中。默认为 null
,这意味着该字段被视为缺失。请注意,如果使用参数,则script
无法设置。script 字段值将基于脚本转换所得, 不再依赖doc文档中的输入。 on_script_error script
中的脚本运行失败时的策略。默认为fail
, 返回doc文档插入失败。store 字段值是否应与字段 _source
分开存储和检索。接受true
或false
(默认)。meta 关于字段的元数据。
-
Keywords
Keywords关键字族,包括keyword
、constant_keyword
和wildcard
。
关键字字段通常用于排序, 聚合, 术语级别的查询 ,例如term
。-
keyword
适用于 结构化内容 ,例如 ID、电子邮件地址、主机名、状态代码、邮政编码或标签。参数 意义 doc_values 该字段是否应该以列的方式存储在磁盘上,以便以后可以用于排序、聚合或脚本?默认为 true
。eager_global_ordinals 是否应该在刷新时急切地加载全局序数?接受true或false (默认)。对于常用于 术语聚合
的字段建议开启。fields 多字段允许为不同目的以多种方式索引相同的字符串值,例如一个用于搜索的字段和一个用于排序和聚合的多字段。 ignore_above 不要索引任何长于该值的字符串。默认为, 2147483647
以便接受所有值。但是请注意,默认动态映射规则会创建一个子keyword
字段,通过设置覆盖此默认值ignore_above
:256
。index 该字段是否应该可以快速搜索?接受 true
(默认)和false
. 仅doc_values
启用的字段仍然可以使用基于术语或范围的查询进行查询,尽管速度较慢。index_options 出于评分目的,应将哪些信息存储在索引中。默认为 docs
但也可以设置为freqs
在计算分数时考虑词频。meta 关于字段的元数据。 norms 字段长度是否对查询评分有影响。接受true或false(默认)。 null_value 当文档中该字段为空时,这个值会当作默认值填充到字段中。默认为 null
,这意味着该字段被视为缺失。请注意,如果使用参数,则script
无法设置。script 字段值将基于脚本转换所得, 不再依赖doc文档中的输入。 on_script_error script
中的脚本运行失败时的策略。默认为fail
, 返回doc文档插入失败。store 字段值是否应与字段 _source
分开存储和检索。接受true
或false
(默认)。similarity 应该使用 哪种评分算法或相似度。默认为BM25. normalizer 如何在索引之前对关键字进行预处理。默认为null,表示关键字保持原样。 split_queries_on_whitespace 为该字段构建查询时,全文查询是否应在空格上拆分输入。接受true或false(默认)。 -
eager_global_ordinals
:为了支持字段值的聚合和其他操作,Elasticsearch 使用了一种称为 doc values 的数据结构。在基于字段类型为术语的场景下, 使用 增量整数或序数 替代 相同的术语 可以使 doc values 存储更紧凑。 -
fields
:给字段设置额外的类型和索引方式。例如主类型为text
用于全文搜索,同时设置一个keyword
用于排序或聚合。 -
ignore_above
:超过ignore_above
值所标记的长度,则不会被存储和索引(不影响_source
的原始数据)。默认为2147483647
, 基本可接受全部长度。 -
index
:该字段是否应该被快速搜索(被倒排索引存储),接受true(默认)和 false。如果字段doc_values
存在仍然可以被查询, 只是相对比慢一些(doc_values
对应的是正排索引)。
-
-
constant_keyword
适用于始终包含相同值的关键字字段, 例如 枚举值。
-
wildcard
用于非结构化机器生成的内容, 例如日志等一些需要经常正则匹配查询的内容。
-
-
Numbers
数字类型,例如long
和double
,用于表示金额。数字类型 参考 long 一个有符号的 64 位整数,最小值为,最大值为。 integer 一个有符号的 32 位整数,最小值为,最大值为。 short 一个有符号的 16 位整数,最小值为 -32768,最大值为 32767 。 byte 一个有符号的 8 位整数,最小值为-128,最大值为127。 double 双精度 64 位 IEEE 754 浮点数,限制为有限值。 float 单精度 32 位 IEEE 754 浮点数,限制为有限值。 half_float 半精度 16 位 IEEE 754 浮点数,限制为有限值。 scaled_float 由 long 支持的浮点数,按固定double比例因子缩放。 unsigned_long 一个无符号的 64 位整数,最小值为 0,最大值为 。 PUT my-index-000001 { "mappings": { "properties": { "number_of_bytes": { "type": "integer" }, "time_in_seconds": { "type": "float" }, "price": { "type": "scaled_float", "scaling_factor": 100 } } } }
参数 意义 coerce 尝试将字符串转换为数字并截断整数的分数。接受true(默认)和false. doc_values 该字段是否应该以列的方式存储在磁盘上,以便以后可以用于排序、聚合或脚本?默认为 false
。ignore_malformed 是否忽略错误格式的数字。如果false(默认),格式错误的数字会引发异常并拒绝整个文档。 index 该字段是否应该可以快速搜索?接受 true
(默认)和false
. 仅doc_values
启用的字段仍然可以使用基于术语或范围的查询进行查询,尽管速度较慢。null_value 当文档中该字段为空时,这个值会当作默认值填充到字段中。默认为 null
,这意味着该字段被视为缺失。请注意,如果使用参数,则script
无法设置。script 字段值将基于脚本转换所得, 不再依赖doc文档中的输入。 on_script_error script
中的脚本运行失败时的策略。默认为fail
, 返回doc文档插入失败。store 字段值是否应与字段 _source
分开存储和检索。接受true
或false
(默认)。meta 关于字段的元数据。 Dates
日期类型,包括date
和date_nanos
。-
alias
映射定义索引中字段的alias
备用名称。别名可用于代替搜索请求中的目标字段。别名的使用限制:-
- 目标必须是具体字段,而不是对象或其他字段别名。
-
- 目标字段在创建别名时必须存在。
-
- 如果定义了嵌套对象,则字段别名必须具有与其目标相同的嵌套范围。
-
- 字段别名只能有一个目标
-
对象和关系类型
-
object
一个 JSON 对象。PUT my-index-000001 { "mappings": { "properties": { "region": { "type": "keyword" }, "manager": { "properties": { "age": { "type": "integer" }, "name": { "properties": { "first": { "type": "text" }, "last": { "type": "text" } } } } } } } }
参数 意义 dynamic 是否允许在插入文档doc时由动态映射为 object
的properties新增属性。接受true(默认)runtime、false 和strict。enabled 为对象字段提供的 JSON 值是否应该被解析和索引(true默认)或完全忽略(false)。 properties 对象内的字段,可以是任何数据类型,包括object。 可以将新属性添加到现有对象。
-
flattened
默认情况下, ES会为object
中每个子字段进行映射和索引(如果事先不知道子字段的名称和类型, 则动态映射
它们)。 这种情况下, 如果这个object类型的对象存在大量的子字段, 会导致子字段映射爆炸。而flattened
类型就是为这种情况应运而生的。ES会把
flattened
类型的JSON对象作为单个字段,只把它的 叶子值 作为关键字索引一个字段中。然后可以通过简单的查询和聚合来搜索对象的内容。PUT bug_reports { "mappings": { "properties": { "title": { "type": "text" }, "labels": { "type": "flattened" } } } } POST bug_reports/_doc/1 { "title": "Results are not sorted correctly.", "labels": { "priority": "urgent", "release": ["v1.2.5", "v1.3.0"], "timestamp": { "created": 1541458026, "closed": 1541457010 } } } # 这里的查询直接以 ‘labels’ 作为关键字!!! POST bug_reports/_search { "query": { "term": {"labels": "urgent"} } }
参数 意义 depth_limit 就嵌套内部对象而言,展平对象字段的最大允许深度。如果展平的对象字段超过此限制,则会引发错误。默认为20 doc_values 该字段是否应该以列的方式存储在磁盘上,以便以后可以用于排序、聚合或脚本?接受true (默认)或false. eager_global_ordinals 是否应该在刷新时急切地加载全局序数?接受true或false (默认)。对于常用于 术语聚合
的字段建议开启。ignore_above 超过此限制的叶值将不会被索引。默认情况下,没有限制,所有值都将被索引。请注意,此限制适用于展平对象字段中的叶值,而不是整个字段的长度。 index 确定该字段是否应该是可搜索的。接受true(默认)或 false. index_options 出于评分目的,应将哪些信息存储在索引中。默认为docs但也可以设置为freqs在计算分数时考虑词频。 null_value 当文档中该字段为空时,这个值会当作默认值填充到字段中。默认为 null
,这意味着该字段被视为缺失。请注意,如果使用参数,则script
无法设置。similarity 应该使用 哪种评分算法或相似度。默认为BM25. split_queries_on_whitespace 为该字段构建查询时,全文查询是否应在空格上拆分输入。接受true或false(默认)。 -
nested
nested
类型是object
数据类型的特殊版本,它允许对对象数组进行索引,从而可以相互独立地查询它们。默认情况下,
object
数据类型对于数组的映射和索引使用的是扁平化展开的方式。PUT my-index-000001/_doc/1 { "group" : "fans", "user" : [ { "first" : "John", "last" : "Smith" }, { "first" : "Alice", "last" : "White" } ] }
实际上,上面文档将在内部转换为看起来更像这样的文档:
{ "group" : "fans", "user.first" : [ "alice", "john" ], "user.last" : [ "smith", "white" ] }
为了让
object
类型字段内的数组对象之间保持独立性,nested
便应运而生了!!!参数 意义 dynamic 是否允许在插入文档doc时由动态映射为 object
的properties新增属性。接受true(默认)runtime、false 和strict。properties 对象内的字段,可以是任何数据类型,包括object。 可以将新属性添加到现有对象。 -
join
为同一索引中的文档定义父/子关系。- mapping定义,
relations:{ "parent-field" : "child-field"}
PUT my-index-000001 { "mappings": { "properties": { "my_id": { "type": "keyword" }, "my_join_field": { "type": "join", "relations": { "question": "answer" } } } } }
- 插入parent-doc的两种方式
PUT my-index-000001/_doc/1?refresh { "my_id": "1", "text": "This is a question", "my_join_field": { "name": "question" } } PUT my-index-000001/_doc/1?refresh { "my_id": "1", "text": "This is a question", "my_join_field": "question" }
- 插入child-doc
PUT my-index-000001/_doc/3?routing=1&refresh { "my_id": "3", "text": "This is an answer", "my_join_field": { "name": "answer", "parent": "1" } }
1. `?routing=parent-doc-id`路由值是强制性的,因为父文档和子文档必须在同一个分片上建立索引。 2. `"answer"`为 `parent/child` 关系中的`child`, 因此必须添加`"parent"`字段, 且填充`parent/child` 关系中的`parent-id`。 3. 在`插入parent-doc`的例子里面, 没有添加`"parent"`字段。因为`"question"`是`parent/child` 关系中的`parent`,插入`parent-doc`时, ES会默认填充`_id`到`"parent"`字段中。
-
join 使用限制
- 一个索引最多只能有一个
join
类型字段 -
parent-doc
和child-doc
必须在同一个shard分片中 - 一个元素可以有多个子元素,但只有一个父元素。
- 可以向现有
join
字段添加新关系。 - 也可以将子元素添加到现有元素,但前提是该元素已经是父元素。
- 一个索引最多只能有一个
-
使用 join 搜索
-
join
会创建一个字段来索引文档中的关系名称, 例如question
,answer
- 它还为每个
parent/child
关系创建一个字段, 例如"my_join_field#question"
, 如果该文档为parent-doc:question
则为自身_id
, 如果该文档为child-doc:answer
则_id
为链接到父文档。
GET my-index-000001/_search { "query": { "parent_id": { "type": "answer", "id": "1" } }, "aggs": { "parents": { "terms": { "field": "my_join_field#question", "size": 10 } } }, "runtime_mappings": { "parent": { "type": "long", "script": """ emit(Integer.parseInt(doc['my_join_field#question'].value)) """ } }, "fields": [ { "field": "parent" } ] }
-
- mapping定义,