天天看点

elasticsearch Update By Query & Reindex APIUpdate By Query & Reindex API

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"
}
           

继续阅读