Java 删除重复项
我目前正在将一些数据(>100MM)从Oracle迁移到Elasticsearch 我使用的批量API工作得很好,但是现在我已经迁移了所有我想通过删除重复项来清理的数据(迁移过程中产生了一些问题,需要2天时间,我不想重新开始) 我可以通过这样的查询查看我的所有副本(使用sense): 但是我在寻找使用查询删除的方法时遇到了很多问题,你看,我需要删除重复项,留下一个副本。我的意思是,如果我有两条消息的记录,我只需要删除一条,以便在ES中保留一条 你知道实现这一目标的方法吗Java 删除重复项,java,elasticsearch,duplicates,Java,elasticsearch,Duplicates,我目前正在将一些数据(>100MM)从Oracle迁移到Elasticsearch 我使用的批量API工作得很好,但是现在我已经迁移了所有我想通过删除重复项来清理的数据(迁移过程中产生了一些问题,需要2天时间,我不想重新开始) 我可以通过这样的查询查看我的所有副本(使用sense): 但是我在寻找使用查询删除的方法时遇到了很多问题,你看,我需要删除重复项,留下一个副本。我的意思是,如果我有两条消息的记录,我只需要删除一条,以便在ES中保留一条 你知道实现这一目标的方法吗 非常感谢您的帮助。运行查
非常感谢您的帮助。运行查询以查找重复的记录,例如:
GET {index}/{type}/_search
{
"query": {
"term": {
"message_id": {
"value": "{message_id_value}"
}
}
}
}
您的查询将返回2条记录,它们具有相同的消息\u id
,但具有不同的\u id
字段_id是内部ES标识符。一旦有了该标识符,您就可以删除该标识符:
DELETE {index}/{type}/{_id}
找到要保存的一个文档的ID,然后可以使用 例如,如果有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仍存在于索引中。首先在本地进行测试。消息\u id与ES文档id相同吗?不,目的不同。是的,我可以这样做,但这是一种手动操作(也许我可以编写一个程序来执行此操作,但我认为速度会很慢)。我有数千个副本,我试图找到一个“按查询删除”,可以省略一条记录或类似的东西是的,我从来没有见过“删除顶部(1)”的等价物。谢谢,当副本超过两次时,这会更有效。这很有效,有点慢,但很好,我想没有更好的方法:(是查询速度慢,还是因为必须对每个
messageId
运行查询而导致查询速度慢?如果是较晚的查询,则可以在一个查询中删除多个messageId。第二个查询,我迭代了所有存储桶,然后逐个删除。昨晚我修改了程序,一次删除100个存储桶;)
DELETE /yourIndex/yourType/_query
{
"query": {
"filtered": {
"query": {
"term": {
"messageId": "13"
}
},
"filter": {
"not": {
"term": {
"_id": 1
}
}
}
}
}
}