Update By Query & Reindex API
###使⽤场景
###● ⼀般在以下⼏种情况时,我们需要重建索引
###● 索引的 Mappings ###发⽣变更:字段类型更改,分词器及字典更新
###● 索引的 Settings ###发⽣变更:索引的主分⽚数发⽣改变
###● 集群内,集群间需要做数据迁移
###● Elasticsearch 的内置提供的 API
###● Update By Query:在现有索引上重建
###● Reindex:在其他索引上重建索引
DELETE blogs/
给索引添加子字段,通过update by query 修改之前的文档的设置
写入文档
PUT blogs/_doc/1
{
"content":"Hadoop is cool",
"keyword":"hadoop"
}
查看 Mapping
GET blogs/_mapping
修改mapping 给content的子字段添加分词器
PUT blogs/_mapping
{
"properties": {
"content": {
"type": "text",
"fields": {
"keyword": {
"type": "text",
"analyzer": "english"
}
}
}
}
}
写入文档
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"
}
}
}
可以通过update by query 的方式修改所有文档。就能够查到新的分词方式下的文档
POST blogs/_update_by_query
查询之前的文档 现在就可以查到
POST blogs/_search
{
"query": {
"match": {
"content.english": "Hadoop"
}
}
}
我们查看映射发现,我们刚才的修改并不是在原来的基础上修改,而是在原来的基础上添加子字段
GET blogs/_mapping
更改已有字段类型的mappings
es不允许我们在已有的mappings上对字段类型进行修改, 我们只能创建新的索引,并且设定正确的字段类型,再重新导入数据
直接修改会报错
PUT blogs/_mapping
{
"properties": {
"content": {
"type": "text",
"fields": {
"english": {
"type": "text",
"analyzer": "english"
}
}
},
"keyword": {
"type": "keyword"
}
}
}
创建新的索引并且设定新的Mapping
PUT blogs_fix/
{
"mappings": {
"properties": {
"content": {
"type": "text",
"fields": {
"english": {
"type": "text",
"analyzer": "english"
}
}
},
"keyword": {
"type": "keyword"
}
}
}
}
通过reindex API将原来的文档数据复制到现有的索引中
source 指定原来的索引 dest 指定复制后的索引
POST _reindex
{
"source": {
"index": "blogs"
},
"dest": {
"index": "blogs_fix"
}
}
现在我们就可以通过新的索引查询到刚才的数据
GET blogs_fix/_doc/1
GET blogs_fix/_mapping
_reindex 只会创建不存在的文档,如果文档已经存在,会导致版本冲突
可以通过op_type 的参数 create 指定只有文档不存在,才进行索引
reindex 大全!! https://blog.csdn.net/ctwy291314/article/details/82734667
POST _reindex
{
"source": {
"index": "blogs"
},
"dest": {
"index": "blogs_fix",
"op_type": "create"
}
}
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"
}
转载:https://blog.csdn.net/weixin_44993313/article/details/106888633
查看评论