ES删除重复项

时间:2015-03-25 14:18:15

标签: java elasticsearch 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
      }
    }
  }
}

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

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

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

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

您的查询将返回2条记录,它们具有相同的message_id但会有不同的_id字段。 _id是内部ES标识符。完成后,您可以删除该标识符:

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

答案 1 :(得分:1)

找到要保存的一个文档的ID,然后可以使用Delete by QueryNot 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仍将出现在索引中。首先在本地进行测试。