我想删除索引中所有重复的文档。我首先尝试使用以下查询检测重复项。
橡皮筋被压碎了是因为 java.lang.OutOfMemoryError: Java heap space
. 堆大小为32gb和500000000个文档
如何找到重复的值。分组依据 item.category
以及 item.profile
(都定义为关键字)。
如何删除那些重复的项目?
GET /requests/_search
{
"size": 0,
"aggs": {
"duplicateCount": {
"terms": {
"field": "item.text",
"min_doc_count": 2
},
"aggs": {
"duplicateDecuments": {
"top_hits": {
}
}
}
}
}
}
谢谢
1条答案
按热度按时间7vhp5slm1#
我将编写一个外部脚本来查询带有分页的docs id,并启动几个delete_by_查询。
您可以使用下面文章中描述的聚合上的“分区”对聚合进行分页。https://spoon-elastic.com/all-elastic-search-post/pagination-aggregation-elasticsearch/
如果有足够的空间,还可以使用带有重新索引的外部索引。通过摄入管道,您可以:
构造一个唯一键(item.category+-+item.profile..)并将其用作\u id
重新索引此索引。它将删除重复项
使用此新索引或清空旧索引,然后将其重新索引。
或者另一种解决方案是:
构造一个唯一键(item.category+-+item.profile..)并将其用作\u id
在此索引中重新编制索引,并仅保留唯一标识符,如\u source.id
使用all id编写一个外部scipt来创建delete\u by\u查询,以删除所有具有这些id的文档。
记住:
ElasticSearch中的delete是一种软删除。要想腾出空间还需要时间。
为了在大量删除后保持良好的性能,最好的做法是进行强制合并https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-forcemerge.html