目录
使用场景
-
一般情况下,我们需要重建索引
-
索引的mappings发生变更,字段类型更改,分词器及字典更新
-
索引的Settings发生变更:索引的主分片数发生改变
-
集群内,集群间做数据迁移
-
-
ES的内置提供的API
-
Update By Query:在现有索引上重建
-
Reindex:在其他索引上重建索引
-
Update By Query
案例1:为索引增加子字段
#写入文档
PUT blogs/_doc/1
{
"content":"Hadoop is cool",
"keyword":"hadoop"
}#修改mapping,增加子字段,使用英文分词器
PUT blogs/_mapping
{
"properties" : {
"content" : {
"type" : "text",
"fields" : {
"english" : {
"type" : "text",
"analyzer" : "english"
}
}
}
}
}GET blogs/_mapping
#写入文档
PUT blogs/_doc/2
{
"content":"Elasticsearch rocks",
"keyword":"elasticsearch"
}#查询新写入的文档:可以查询对应的文档
POST blogs/_search
{
"query": {
"match": {
"content.english": "elasticsearch"
}
}
}#查询mapping修改之前的文档:查询不出对应的文档
POST blogs/_search
{
"query": {
"match": {
"content.english": "Hadoop"
}
}
}
- 解决办法
#更新所有文档
POST blogs/_update_by_query
{
}#查询mapping修改之前的文档:可以查询对应的文档
POST blogs/_search
{
"query": {
"match": {
"content.english": "Hadoop"
}
}
}
案例2:更改已有字段类型的Mapping
-
ES不允许在原有Mappings上对字段类型或者字段的analyzer进行修改
-
只能创建新的索引,并且设定正确的字段类型,利用Reindex API再重新导入数据
Reindex
-
Reindex API 支持把文档从一个索引拷贝到另外一个索引
-
使用Reindex API的一些场景
-
修改索引的主分片数
-
改变字段的Mapping中的字段类型
-
集群内数据迁移/跨集群的数据迁移
-
-
两个注意点
-
_source字段是enable
-
先创建好想要的mapping,通过Reindex API
-
Op Type
- _index只会创建不存在的文档
- 文档如果存在会导致版本冲突
- 通过op_type: 指定只有文档不存在,才进行索引
version_type
-
version_type属性默认值为internal,即当发生冲突后会覆盖之前的document,而当设置为external则会新生成一个另外的document,可以通过 version_type=external 的方式 设置处理冲突的方式
POST _reindex
{
"source": {
"index": "blogs"
},
"dest": {
"index": "blogs_fix",
"version_type": "external"
}
}
- 将op_type设置为create时,只会对发生不同的document进行reindex,(若定时机制的reindex则可以使用该方式只对最新的不存在的document进行reindex)。并且可以将conflicts属性设置为proceed,将冲突进行类似于continue的操作
POST _reindex
{
"source": {
"index": "blogs"
},
"dest": {
"index": "blogs_fix",
"version_type": "external"
},
"conflicts": "proceed"
}