【问题标题】:Elasticsearch reindex items in existing type mappingElasticsearch 重新索引现有类型映射中的项目
【发布时间】:2018-08-24 20:02:41
【问题描述】:

我向类型映射添加了一个新属性,我需要重新索引该类型的所有现有项才能使用新属性。

我应该使用哪个 API 来执行此操作?

【问题讨论】:

    标签: elasticsearch elasticsearch-5 reindex


    【解决方案1】:

    如果您要添加一个以前从未在索引中存在过的新字段,则无需重新索引,您只需使用 PUT Mapping API http://nocf-www.elastic.co/guide/en/elasticsearch/reference/current/indices-put-mapping.html添加新字段

    您在使用新字段更新映射之前创建的文档将不包含此新字段,因此搜索或聚合不会考虑此字段,它将作为缺少的字段工作。

    如果您需要在使用新字段类型的默认值搜索旧文档时考虑这个新字段,那么您需要重新索引。例如,如果您的新字段是整数类型,并且您明确需要将此字段包含在具有零值(默认值)的旧文档中,因为您想计算有多少文档具有此新字段 = 0,那么您需要重新索引,但是大多数用例我们可以将缺失字段视为默认值,因此无需重新索引。

    在 ElastiSearch (ES) 中,无法在映射中添加新字段,并且旧索引会自动更新,即使由于 ES 存储数据的性质而使用该新索引的默认值也是如此。 ES 使用不可变段来存储索引,因此当您更新文档时,ES 不会物理更新已更改的字段,但它会创建旧文档的新副本,并使用新数据更新并将旧文档标记为已删除,因此即使您更新文档中的一个简单字段,您也会获得该文档的新版本,而旧版本将被标记为已删除

    【讨论】:

    • 这个答案的默认值部分使它比它需要的更令人困惑。但是,总的来说,这确实回答了我的问题。
    • 在这种情况下,如果在 put 请求和一个新字段中,我也有一个与当前类型相同的现有字段,elasticsearch 是否会在内部重新索引该类型?
    【解决方案2】:

    另一种选择是在 Elasticsearch 中创建您的代码将引用的索引别名。如果您需要进行映射更改,您可以执行以下操作,这样可以减少停机时间。

    • 使用更新的 ES 映射配置创建新索引
    • 使用 reindex api 将数据复制到这个新索引中
    • 删除旧的索引别名并使用相同的名称重新创建它。

    【讨论】:

      【解决方案3】:

      由于没有人愿意为这个长期存在的问题提供完整而明确的答案,所以我会去做:

      # 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  
      
      # Copy back all documents in the original index to force their reindexetion
      POST /_reindex
      {
        "source": {
          "index": "my_index-000001"
        },
        "dest": {
          "index": "my_index"
        }
      }
      
      # Disable blocks write
      PUT /my_index/_settings
      {
        "settings": {
          "index.blocks.write": false
        }
      }
      
      # Finaly delete the temporary index
      DELETE my_index-000001
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 有没有办法在不创建新索引的情况下做到这一点?我能够在不创建新索引的情况下添加新属性。我也想在不创建新索引的情况下重新索引。
        猜你喜欢
        • 2019-04-16
        • 1970-01-01
        • 1970-01-01
        • 2017-03-11
        • 2020-11-24
        • 1970-01-01
        • 2018-11-17
        • 2017-10-08
        • 1970-01-01
        相关资源
        最近更新 更多