ElasticSearch:查找具有多个相同字段的文档

时间:2016-07-05 19:42:40

标签: elasticsearch

我有一个ElasticSearch索引,里面有很多文档。数据模型大约有20个字段;其中有5个,如果它们相同,会让我得出结论,该文件是重复的。基本上,我想在所有5个字段中对具有相同值的文档进行分组,并在每个结果桶中返回文档(而不仅仅是聚合值)。

ElasticSearch可以这样做吗?

2 个答案:

答案 0 :(得分:1)

所以简短的回答是肯定的,elasticsearch绝对可以做到这一点,通过以下简短的例子可以看出:

{
  "filtered": {
  "query": {
    // Your query goes here
    }
  },
  "filter": {
    "script": {
      "script": "doc['field1'].value ==  doc['field2'].value ==  doc['field3'].value ==  doc['field4'].value"
    }
  }
 }
}

我只尝试了2个字段,但我认为它应该比这更有用。

您基本上使用过滤器来删除这些字段彼此不相同的文档。希望这会有所帮助。

如果您想将documentA与documentB匹配,并查看其中5个字段是否相同,那么这将是一个不同的问题。

要解决这个问题,我的建议是编写一个脚本,一次获取一个文档,然后对您要查找的字段进行弹性搜索查询过滤,并查看是否有其他文档出现。如果他们这样做,删除它们并重复该过程。如果没有匹配,请移动下一个文档。如果没有其他文件需要检查,您就完成了。 (您可能希望保留文档计数器或文档名称列表以跟踪您何时完成)

这可能不是您正在寻找的干净的弹性搜索方法,可能有更好的方法,但这是解决您的问题的一种方法。

答案 1 :(得分:1)

尝试使用以下步骤。

  1. 使用所有字段上的术语聚合过滤掉所有字段中的所有不同值。
  2. 使用所有字段的查询
  3. 查询每个值
  4. 将min_should_match参数设置为5
  5. 正如您所看到的,至少有5个字段应该具有要返回的文档的值。看一下第一个例子here

    要获取存储桶中的完整文档,请按照here

    所述使用热门命中聚合