我目前正在将一些数据(> 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条。
你知道实现这个目标的方法吗?
非常感谢任何帮助。
答案 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 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仍将出现在索引中。首先在本地进行测试。