elasticsearch按列值查找重复文档

mqxuamgl  于 2021-06-13  发布在  ElasticSearch
关注(0)|答案(1)|浏览(474)

我想删除索引中所有重复的文档。我首先尝试使用以下查询检测重复项。
橡皮筋被压碎了是因为 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": {

          }
        }
      }
    }
  }
}

谢谢

7vhp5slm

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

相关问题