Mapping
mapping就是ES数据字段field的type元数据,ES在创建索引的时候,dynamic mapping会自动为不同的数据指定相应mapping,mapping中包含了字段的类型、搜索方式(exact value或者full text)、分词器等。
查看mapping
在dev tools中命令查询
GET user/_mapping
在索引管理界面中查看
stack management ->index mamagement ->(select table) ->mappings
ES 数据类型
常见数据类型
数字类型
long integer short byte double float half_float scaled_fload unsigned_long
keywords
适用于索引结构化字段,可以用于过滤排序聚合,只能通过精确值(exact value)搜索到.eg:id
constant_keyword:始终包含相同值的关键字字段.
wildcard:可以针对类似grep的通配符查询优化日志行和类似的关键字值.
Dates: 包含date与date_nanos. es内部存储时间使用毫米.若还需要精确,用nanos来精确到纳秒.
alias: 为现有字段定义别名
binary: 二进制数据
range: 区间类型, integer_range, float_range, long_range, double_range, date_range.
text: 默认生成倒排索引,不生成正排索引.
对于需要全文搜索的字段,其内容需要被解析, 在生成倒排索引前,字符串会被分析器分成一个一个词项.
text类型不用于排序,很少用于聚合. 因为加载text字段需要大量堆空间用于正排索引,资源消耗过大,可能出现延迟等问题.
对象关系类型
- object: 用于单个json对象
- nested: 用于json对象数组
- flattened: 允许将整个json对象索引为单个字段.
结构化类型
geo-point: 经纬度
geo-shape: 多边形
point: 坐标点
shape: 笛卡尔多边形
特殊类型
ip地址: 用于ipv4,ipv6
completion: 提供自动完成建议
tocken_count: 计算字符串中令牌数量
murmur3: 在索引时计算值的哈希并存于索引中.
annotared-text: 索引包含特殊标记的文本.
percolator:
join: 为同一索引内的文档提供父子关系.
array: 无需专用的字段数据类型,任意字段都可以包含零个或者多个值.只要满足数据的结构一致即可.
两种映射类型
dynamic field mapping:
整形 -> long
浮点型 -> float
true/false -> boolean
日期 -> date
数组 -> 取决于数字中的第一个有效值
对象 -> object
字符串 -> 映射成text和keyword两个类型
除了以上类型外,其他数据类型需要显示映射.
expllcit field mapping 手动映射
put /[table]
{
"mappings": {
"properties": {
"[field]" :{
"[mapping_parameter]": "[mapping_vales]"
}
}
}
}
# eg: 设置描述字段类型
PUT /mapping_1
{
"mappings": {
"properties": {
"描述" :{ // 字段名称
"type": "text", // 字段类型
"analyzer": "standard", // 分词器选择
"fields": {
"keyword":{
"type":"keyword",
"ignore_above":255
}
}
}
}
}
}
映射参数
index: 是否创建倒排索引,若不创建,该字段不会通过索引被搜索到.元数据中任然存在.
analyzer: 指定分析器(character filter,tokenizer,token filters).
boost: 当前字段相关度的评分权重,默认1. 在联合搜索时,计算出相关度的先后位置.
coerce: 是否允许强制类型转换. 可以自动转换字符串数字为数字.
copy_to: 允许将多个字段的值复制到数字字段中.然后作为单个字段进行查询.
doc_values: 正排索引开关.可以提升排序与聚合效率.若不需要对字段进行排序聚合与访问,可以禁用doc值来节省磁盘空间.不支持text类型的字段.
dynamic: 是否可以动态添加新字段.默认true
true: 检测到的新字段将自动添加到映射中.
false: 检测到的新字段不会存在mapping中.但数据还是会保存.只是没有索引,无法搜索该字段.需要在mapping中显示添加新字段.
strict: 如果检测到新字段.将抛出异常并拒绝文档.需要提前显示添加新字段.
eager_global_ordinals: 用于聚合的字段上,优化聚合性能.
enable: 是否创建倒排索引.可以对单字段设置,也可以对全局设置.该状态一旦设置无法修改.
fielddate: 在索引关闭的情况下,因业务变更需要重新使用索引,可设置此参数.在jvm中动态的添加索引,用于排序或聚合.
fields: 给field创建多个字段, 用于不同目的.eg:text添加keyword.达到搜索目的.
ignore_above: 超过长度将忽略.
ignore_malformed: 类型错误忽略.
index_options:
index_prefixes: 前缀索引
mate: 附加元数据
normalizer:
norms: 是否禁用评分.
null_value: 为null时设置的默认值
search_analyzer: 设置单独的查询时分析器
similarity: 相关度算法设置
store: 设置字段是否仅查询.
term_vector:运维参数
更新mapping语句
GET ip_address/_mapping
PUT ip_address/_mapping/_doc
{
"properties":{
"ip" : {
"type" : "keyword"
},
"province": {
"type" : "keyword"
},
"city": {
"type" : "keyword"
}
}
}