用于重复项的Elasticsearch聚合

时间:2019-01-27 23:57:55

标签: elasticsearch duplicates aggregation

我希望有人可以帮助我解决这个问题。呆了几天,感觉就像撞墙一样。我真的很感谢您对此主题的任何帮助。这是问题-

我正在将地址记录填充到索引中。问题是源根据地址和城市发送了大量重复数据,需要重复数据删除(不幸的是,除了这些文本字段外没有其他PK,所以我知道这不是最快的查询,但是我可以(从目前的性能方面来说)。这种重复数据删除无需实时进行,我们可以每天进行一次。大约有1600万个文档,其中大约80万个看起来像是重复的文档。这是我到目前为止所做的-

  1. 首先,我忽略地址或城市为空的任何行。我也只考虑将record_status设置为“ active”的文档。有关此标志的更多信息,请参见步骤3。
  2. 使用以下聚合查询查找重复项
  3. 一旦我将结果以块的形式返回,我就会向ES发出更新查询,以翻转名为record_status ='inactive'的属性,以便在下一个聚合调用中将其排除。
  4. 无论出于何种原因,创建存储桶时似乎都无法捕获所有重复的文档。我可以看到索引中存在特定的地址+城市组合31次,但存储桶只列出了其中的6个。更糟糕的是,当我手动添加该特定地址时,它会显示所有31个文档。有什么作用?

这是我正在使用的DSL查询

{
  "size": 0,
  "aggs": {
"addresses": {
  "terms": {
    "script" : {
        "lang": "painless",
        "source": "if ((doc['display_address.keyword'].value != null && doc['city.keyword'].value != null) && doc['record_status.keyword'].value == 'active') {return doc['display_address.keyword'].value + doc['city.keyword'].value;} else {return null;}"
  },
  "size": 500,
  "exclude": "null"
},
"aggs": {
  "my_filter": {
    "bucket_selector": {
      "buckets_path": {
        "the_doc_count": "_count"
      },
      "script": "params.the_doc_count > 1"
    }
  },
  "final_docs": {
    "top_hits": {
      "sort": [
        {
          "list_date": {
            "order": "desc"
          }
        }
      ],
      "_source": {
        "includes": [
          "_id",
          "list_date",
          "display_address",
          "city"
        ]
      },
      "size": 100
    }
  }
}
  }
}
}

以上查询为我提供了多个地址的不正确数据。例如,对于123 Main st,底特律只回来了6个文档。

如果我只是添加

`"include": "123 Main st"` 

在我的汇总中,突然之间我看到底特律123 Main st的31个重复项

0 个答案:

没有答案