我目前正在将一些数据 (> 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 条。
你知道实现这一目标的方法吗?
非常感谢任何帮助。
最佳答案
找到您要保存的文档的 ID,然后您可以使用 Delete by Query与 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 仍会出现在索引中。首先在本地测试一下。
关于java - ES删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29258252/