ES删除重复项

ES deleting duplicates

我目前正在将一些数据(> 100MM)从 Oracle 迁移到 Elasticsearch。

我正在使用批量 API 并且运行良好,但现在我已经迁移了所有数据,我想通过删除重复项(在迁移过程中产生的问题需要像2 天,我不想重新开始)。

我可以通过这样的查询(使用 sense)查看我所有的重复项:

GET myindex/mytype/_search?search_type=count
{
  "aggregations": {
    "duplicates": {
      "terms": {
        "field": "message_id",
        "min_doc_count": 2,
        "size": 100
      }
    }
  }
}

但是我在寻找一种方法来删除那些使用查询删除的方法时遇到了很多问题,你看,我需要删除重复项,留下一个副本。我的意思是,如果我有 2 条 message_id XXXX 的记录,我只需要删除一条,以便在 ES 中保留 1 条。

你知道实现这个的方法吗?

非常感谢任何帮助。

运行 查找重复记录的查询,例如:

GET {index}/{type}/_search
{
  "query": {
    "term": {
      "message_id": {
        "value": "{message_id_value}"
      }
    }
  }
}

您的查询将 return 2 条记录,它们具有相同的 message_id 但具有不同的 _id 字段。 _id 是内部 ES 标识符。一旦你有了它,你就可以删除那个标识符:

DELETE {index}/{type}/{_id}

找到您要保存的一个文档的 ID,然后您可以使用 Delete by Query with a Not Filter

例如,如果您有 3 个文档 ID 分别为 1、2、3 的文档,所有文档的 messageId 都为 13,并且您想保存文档 1,您可以 运行 此查询:

DELETE /yourIndex/yourType/_query
{
    "query": {
        "filtered": {
            "query": {
                "term": {
                    "messageId": "13"
                }
            },
            "filter": {
                "not": {
                    "term": {
                        "_id": 1
                    }
                }
            }
        }
    }
}

文档 2 和文档 3 将被删除,文档 1 仍将存在于索引中。先在本地测试一下。