将记录复制到另一个没有ID冲突的索引

时间:2017-10-04 21:51:34

标签: elasticsearch

我想将记录从索引复制到另一个。我这样使用POST _reindex { "dest": { "index": "dst" }, "source": { "index": "src", "query": { "bool": { "must": [ { "match": { "name": "HEIDI" } } ] } } } }

_id

也不一定要复制_id,因为文档实际上是不同的,并且更喜欢生成新的{{1}}。我想要真正避免的一件事是,如果偶尔匹配ID,则从目标中的源覆盖文档。

如何使用ElasticSearch 5进行设置? 感谢

2 个答案:

答案 0 :(得分:1)

有两种方法可以做到这一点:

  1. 只需编写一个python脚本即可从源代码获取文档并对目标进行新的摄取。我有一些python代码已经做同样的事情。也许它会帮助你。这是:
  2. `

    from elasticsearch import helpers
    import elasticsearch
    
    es = elasticsearch.Elasticsearch(
        hosts=[{'host': '<your-es-host-name>'}],
    )
    
    results = helpers.scan(
        es,
        query={"query": {
            "bool": {
                "must": [
                    {
                        "match": {
                            "name": "HEIDI"
                        }
                    }
                ]
            }
        }},
        scroll="20m",
        index="<your-source-index-name>",
        doc_type="<your-source-index-type>"
    )
    
    actions = []
    for item in results:
        action = {
            "_index": "<your-dest-index-name>",
            "_type": "<your-dest-index-type>",
            "_source": item["_source"]
        }
        actions.append(action)
    
    helpers.bulk(es, actions)
    

    `

    1. 您可以使用reindex API并使用以下方法避免ID冲突:
    2. POST _reindex { "conflicts": "proceed", "dest": { "index": "dst", "op_type": "create" }, "source": { "index": "src", "query": { "bool": { "must": [ { "match": { "name": "HEIDI" } } ] } } } }

      但请记住,对于#2,与目标索引冲突的ID不会重新编制索引。

答案 1 :(得分:0)

添加另一个使用POST _reindex的答案,因为它可能会对将来有所帮助。因此,诀窍是添加将_id重置为null的脚本。这对我有所帮助:

POST _reindex
{
    "source": {
        "index": "src"
    },
    "script": {
        "source": "ctx._id = null"
    },
    "dest": {
        "index": "dst"
    }
}