首页 > 解决方案 > 使用 ElasticSearch 进行模糊重复搜索

问题描述

我有一个相当大的N文档数据集,其中只有不到 1% 是我想要识别的近乎重复的。我有很多数字字段和一些文本字段。如果...,我认为数据集中的两个文档关闭

  1. 除了一个、两个或三个数据字段外,所有数据字段都完全相同。
  2. 两个文档的相应文本字段只需进行几次编辑(即 ElasticSearch 使用的Levensthein 距离)。

您将如何应对使用 ElasticSearch 识别模糊重复项的挑战

我已经很难为第 (1) 部分编写一个(通用)ElasticSearch 查询,它没有明确使用字段名称。我真的必须构建以下模式的巨大查询,还是有更聪明的方法?

( SELECT * FROM MessyData AS T1
  JOIN MessyData AS T2
  WHERE T1.F1 != T1.F1 AND T1.F2 = T2.F2 AND T1.F3 = T2.F3 AND ... )
UNION ALL
( SELECT * FROM MessyData AS T1
  JOIN MessyData AS T2
  WHERE T1.F1 = T1.F1 AND T1.F2 != T2.F2 AND T1.F3 = T2.F3 AND ... )
UNION ALL
( SELECT * FROM MessyData AS T1
  JOIN MessyData AS T2
  WHERE T1.F1 = T1.F1 AND T1.F2 = T2.F2 AND T1.F3 != T2.F3 AND ... )
UNION ALL 
( ... )

注意:我使用 SQL 伪代码来说明我对除一个字段之外的所有字段都相同的情况的含义。F代表字段,T代表表,但它将是 ElasticSearch 中的索引。

计算树状图或使用另一种相似性度量来比较每个文档,每个文档都给了我计算工作量,N·(N-1)因此是不可行的。

对于问题的第二部分,我正在考虑的方法是用m测试文档(m比 小得多N)探测我的数据集,将 ElasticSearch 的所有m查询得分相加。这会给我 O(m·N) 作为计算工作量,但我仍然必须对所有N分数总和进行排序,至少部分排序,或者在运行中排序。

除了这个问题,More Like This还有其他算法吗?Fuzzy Query也感谢科学论文的链接!

参考

标签: algorithmelasticsearchnlpduplicates

解决方案


我建议将您的字段分为 4 组的快速而肮脏的方法。计算每组字段的哈希值。除非您在这四个度量之一上具有相同的哈希值,否则您不能接近重复。

运气好的话,这个技巧意味着您只需要计算任何给定文档,其中包含相对较少的其他文档,这些文档在四分之一的字段上完全匹配。

如果“在同一哈希上匹配”的簇太大,您可以对不属于该簇的字段重复该技巧,以期减少需要完成的工作量。


推荐阅读