ES Mapping
概念和用法
Mapping定义了ES的索引结构、字段类型、分词器等属性
Mapping类似于“表结构”,但有所不同,如分词器、评分、一个字段可以有多个类型等。
# 查看有哪些索引
GET _cat/indices?v
# 查看索引的mapping
GET <index>/_mapping
# 查看指定字段的mapping
GET <index>/_mapping/field/<field>
字段的数据类型
- 数字类型
- 基本数据类型:
binary
、boolean
、alias
- keywords类型
keyword
类型★:是用于索引结构化的字段,可以用于过滤、排序、聚合。keyword
类型的字段只能通过精确值搜索。constant_keyword
:始终包含相同的关键字字段wildcard
:可针对类似grep
的
- Dates类型
date
:JSON没有日期数据类型,因此ES中的日期可以是:- 包含格式化日期的字符串
- 时间戳
date_nanos
:纳秒,支持的日期范围:1970~2262年
- 对象类型
object
类型:非基本数据类型之外,默认的json对象为object类型flattened
:单映射对象类型,其值是json对象nested
★:嵌套类型join
:父子级关系类型
- 空间数据类型
geo_point
:纬度和经度点geo_shape
:复杂的形状,例如多边形point
:任意笛卡尔点shape
:任意笛卡尔几何
- 文档排名类型
dense_vector
:记录浮点值的密集向量rank_feature
:记录数字特征以提高查询时的命中率rank_features
:记录数字特征以提高查询时的命中率
- 文本搜索类型
text
★:文本类型。可分词类型,用以支持全文检索annotated-text
:包含特殊文本标记,用于标识命名实体completion
★:用于自动补全,即搜索推荐search_as_you_type
:类似文本的字段,经过优化 为提供按类型完成的查询提供现成支持 用例token_count
:文本中的标记计数
常见的映射参数
index
:当前字段是否创建倒排索引,默认true
analyzer
:指定分词器
boost
:对当前字段相关度的评分权重,默 认1
coerce
:是否允许强制类型转换
doc_values
:默认true,为了提升排序和聚合效率,如果确定不需要对字段进行排序或聚合,也不需要通过脚本访问字段值,则可以禁用doc值以节省磁盘空间(不支持text
和annotated_text
)
dynamic
:控制是否可以动态添加新字段。true
:新检测到的字段将添加到映射中(默认)。false
:新检测到的字段将被忽略,这些字段不会被索引,因此将无法搜索,但仍会出现在_source
返回的匹配项中,这些字段不会添加到映射中,必须显式添加新字段。
strict
:如果检测到新字段,则会引发异常并拒绝文档,必须将新字段显式添加到映射
eager_global_ordinals
:用于聚合的字段上,优化聚合性能,但不适用于frozen indices
。frozen 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 type | dynamic |
---|---|
true/false | boolean |
小数 | float |
整数 | long |
object | object |
数组 | 取决于数组中的第一个非空元素的类型 |
日期格式字符串 | 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
:主要用于对数据类型的匹配。match
和unmatch
:用于对字段名称的匹配。
案例:
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
类型