- DBMS数据库有自己的表结构,同样,es中的doc也有自己的结构,称之为mapping,在插入数据是,如果不创建mapping,es会自动根据数据类型创建动态的mapping。由于es底层使用了lucene的原因,不支持对mapping的修改,可使用索引重建的方式
elasticsearch通用mapping模板
{
"mappings":{
"properties":{
"文本字符串":{
"type":"keyword"
},
"日期时间":{
"type":"date",
"format":"yyyy-MM-dd HH:mm:ss"
},
"结构嵌套":{
"properties":{
"对象类型":{
"type":"object"
},
"文本字符串分词":{
"type":"string",
"analyzer":"ik_max_word",
"index_options":"offsets"
}
}
}
}
}
}
加粗 部分为经常用到的mapping配置项
-
enabled
- 作用:仅存储、不做搜索和聚合分析
- 值:false|true
-
index
- 作用:是否构建倒排索引(即是否分词,设置false,字段将不会被索引)
- 值:false|true
-
index_option
- 作用:存储倒排索引的哪些信息
- 值:docs:索引文档号|freqs:文档号+词频|positions:文档号+词频+位置,通常用来距离查询|offsets:文档号+词频+位置+偏移量,通常被使用在高亮字段
- 分词字段默认是positions,其他默认时docs
-
norms
- 作用:是否归一化相关参数,如果字段仅用于过滤和聚合分析、可关闭
分词字段默认配置,不分词字段:默认{“enable”: false},存储长度因子和索引时boost,建议对需要参加评分字段使用,会额外增加内存消耗 - 值:“enable”: true|false, “loading”: “lazy”
- 作用:是否归一化相关参数,如果字段仅用于过滤和聚合分析、可关闭
-
doc_value
- 作用:是否开启doc_value,用户聚合和排序分析
对not_analyzed字段,默认都是开启,分词字段不能使用,对排序和聚合能提升较大性能,节约内存 - 值:true(缺省)| false
- 作用:是否开启doc_value,用户聚合和排序分析
-
fielddata
- 作用:是否为text类型启动fielddata,实现排序和聚合分析
针对分词字段,参与排序或聚合时能提高性能,不分词字段统一建议使用doc_value - 值:disabled|enable
- 作用:是否为text类型启动fielddata,实现排序和聚合分析
-
store
- 作用:是否单独设置此字段的是否存储而从_source字段中分离,只能搜索,不能获取值
- 值:false|true
-
dynamic
- 作用:控制mapping的自动更新
- 值:true|false|strict
-
analyzer
- 作用:指定分词器,默认分词器为standard analyzer
- 值:ik_max_word|ik_smart(这两种是常见的中文分词器,关于分词器的见ElasticSearch分词器)
-
search_analyzer
- 作用:设置搜索时的分词器,默认跟analyzer是一致的
- 值:同analyzer
-
boost
- 作用:字段级别的分数加权,默认值是1.0
- 值:具体值
-
ignore_above
- 作用:超过100个字符的文本,将会被忽略,不被索引
- 值:具体值(100)
-
fields
- 作用:可以对一个字段提供多种索引模式,同一个字段的值,一个分词,一个不分词
- 值:{“raw”: {“type”: “string”, “index”: “not_analyzed”}}
-
similarity
- 作用:默认时TF/IDF算法,指定一个字段评分策略,仅仅对字符串型和分词类型有效
- 值:BM25|TF/IDF
使用索引重建的方式"修改"mapping
- 如需要将旧索引的itemId字段改为keyword类型,则执行以下请求
# 创建index:
PUT /test_v2
# 设置mapping:
POST /test_v2/item/_mapping
{
"properties": {
"itemId": {
"type": "keyword"
},
"itemName": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
}
}
}
# 使用reindex api将旧索引数据导入新索引,索引重建后可使用reindex命令迁移数据,如将test_v1数据迁移至test_v2请求如下:
POST _reindex
{
"source": {
"index": "test_v1",
"type": "item"
},
"dest": {
"index": "test_v2",
"type": "item"
}
}
# 为新索引添加别名后,在程序代码中可以使用固定别名查询动态的索引名称,然后进行查询,如此索引重建则不会引起程序的变动
## 添加别名请求:
POST /_aliases
{
"actions": [
{ "add": {
"alias": "item_alias",
"index": "test_v2"
}}
]
}
## 将旧索引别名迁移到新索引请求:
POST /_aliases
{
"actions" : [
{ "remove" : { "index" : "test_v1", "alias" : "item_alias" } },
{ "add" : { "index" : "test_v2", "alias" : "item_alias" } }
]
}