elasticsearch 在现有类型Map中对项重新编制索引

vbkedwbf  于 2022-12-03  发布在  ElasticSearch
关注(0)|答案(4)|浏览(129)

我向类型Map添加了一个新属性,并且需要重新索引该类型的所有现有项,以便使用新属性。
我应该使用哪种API来实现这一点?

dkqlctbz

dkqlctbz1#

如果要添加一个新字段,而该字段以前从未存在于您的索引中,则无需重新建立索引,只需使用PUTMapAPI http://nocf-www.elastic.co/guide/en/elasticsearch/reference/current/indices-put-mapping.html添加新字段即可
在使用新字段更新Map之前创建的文档将不包含此新字段,因此搜索或聚合将不考虑此字段,它将作为缺失字段工作。
如果需要在使用新字段类型的默认值搜索旧文档时考虑此新字段,则需要重新编制索引。例如,如果新字段的类型为integer,并且您明确需要将此字段包含在旧文档中且值为零(默认值)因为您要计算有多少文档具有此新字段= 0,所以您需要重新索引,但大多数用例我们可以将缺少的字段视为默认值,因此无需重新索引。
在ElastiSearch中没有办法(ES)在Map中添加一个新字段,旧索引将自动更新,即使由于ES存储数据的特性而使用新索引的默认值也是如此。ES使用不可变段来存储索引,因此当您更新文档时,ES不会物理更新已更改的字段,但它会创建一个使用新数据更新的旧文档的新副本,并将旧文档标记为已删除,因此,即使在更新文档中的简单字段时,也会获得文档的新版本,而旧文档标记为已删除

gcmastyq

gcmastyq2#

您需要执行这些命令。用索引的名称替换my_index。

# First of all: enable blocks write to enable clonage
PUT /my_index/_settings
{
  "settings": {
    "index.blocks.write": true
  }
}

# clone index into a temporary index
POST /my_index/_clone/my_index-000001  

# Disable blocks write
PUT /my_index/_settings
{
  "settings": {
    "index.blocks.write": false
  }
}

# Copy back all documents in the original index to force their reindexetion
POST /_reindex?wait_for_completion=false
{
  "source": {
    "index": "my_index-000001"
  },
  "dest": {
    "index": "my_index"
  }
}

# Copy the task id from the previous result and check the progression:
GET /_tasks/K1IOaNo8R26gRwc55yXJLQ:1165945865

# Finaly delete the temporary index
DELETE my_index-000001

用途:

  • 将索引克隆到临时索引中
  • 然后将所有文档从临时索引重新索引到原始索引。这将覆盖现有文档并重新生成缺少的字段。

注意事项:此方法假定没有任何内容在索引中插入新数据。在重新索引过程中,新数据将被覆盖。

zsohkypk

zsohkypk3#

另一个选择是在Elasticsearch中创建一个代码将引用的索引别名。如果需要更改Map,可以执行以下操作,这样几乎不需要停机。

  • 使用更新的ESMap配置创建新索引
  • 使用reindexapi将数据复制到此新索引
  • 请删除旧的索引别名并使用相同的名称重新创建。
qgzx9mmu

qgzx9mmu4#

必须使用reindex api:首先必须创建新索引,然后可以使用reidexapi将数据从源索引传输到新索引中。

相关问题