java - 创建基于 solr 的重复数据删除系统的最佳实践是什么?

标签 java search solr lucene deduplication

我正在设置一个基于 solr 搜索的重复数据删除系统,该系统将返回与搜索条件匹配的搜索结果。我使用数据导入处理程序从数据库中提取数据并在 Solr 服务器上创建索引文档。

我的 solr 架构如下:

<field name="customer_id" type="int" indexed="true" stored="true" required="true" />
<field name="fname" type="phonetic" indexed="true" stored="true" />
<field name="lname" type="phonetic" indexed="true" stored="true"/>
<field name="address" type="text_en" indexed="true" stored="true" />
<field name="city" type="string" indexed="true" stored="true"  />
<field name="state" type="string" indexed="true" stored="true"  />
<field name="zipcode" type="string" indexed="true" stored="true"  />
<field name="telephone" type="string" indexed="true" stored="true"  />

如上所示,我已使用 DoubleMetaphoneFilterFactory 将名字 (fname) 和姓氏 (lname) 字段的类型指定为拼音,以便进行拼音搜索。拼音字段类型说明如下:

<fieldtype name="phonetic" stored="false" indexed="true" class="solr.TextField" >
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory" />
    <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="15" side="front"/>
    <filter class="solr.DoubleMetaphoneFilterFactory" inject="true"/>
  </analyzer>
</fieldtype>

我希望我的搜索返回匹配所有指定查询字段的文档,而不仅仅是其中一个搜索字段。

我的问题是,如果我单独搜索 fname、lname 或地址,那么结果非常相关,但是当我将过滤器查询与主要搜索查询一起使用时,结果包含来自两个搜索条件的结果的并集。

请有人指出我做错了什么。 此外,在为银行的此类重复数据删除系统设计 solr 架构时,是否需要牢记任何最佳实践,以识别重复的客户记录。

提前致谢!

最佳答案

如果您想要的是基于 Lucene 的客户重复数据删除系统,您可能只想使用 Duke反而。它是一个通用的重复数据删除引擎,使用 Lucene 为记录建立索引,然后使用更复杂的比较器(如 Levenshtein、Weighted Levenshtein、Jaro-Winkler 等)进行详细比较。它有用于 JDBC 数据库等的标准连接器,但你也可以自己编写,甚至直接为引擎提供数据。比较基于概率与贝叶斯定理的结合。

根据我编写 Duke 的经验,我会说您将很难让 Lucene 为您完成所有工作。正如您所说,搜索结果非常好,但精度不会像您从专门为此设计的算法中获得的那样好。

因此,我建议您使用专为重复数据删除而构建的工具。我提到 Duke 是因为它基于 Lucene 并且非常接近你想要构建的东西,但你真的可以使用任何 record linkage引擎。 Duke 使用 Lucene 来提高性能(因此我们不必比较所有记录对),但其他引擎有其他方法可以在不使用搜索的情况下实现类似的性能,我想对你来说 Lucene 是否在里面并不重要.因此,上面链接的记录链接页面上列出的任何工具都可以为您工作。

请注意,几十年来,这一直是一个巨大的研究领域,人们在解决这个问题上取得了很好的进展。所以现成的工具真的很好。也有很多用于此的商业工具,但由于您已经开始构建自己的工具,所以我认为这些工具无关紧要。

完全披露:我是 Duke 的作者。我想我们不应该在这里推销自己,但实际上,对我来说,使用现成的软件包比构建自己的软件包听起来要好得多。 YMMV.

关于java - 创建基于 solr 的重复数据删除系统的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12260944/

相关文章:

java - 如何使用实现特定接口(interface)的对象声明一个 LinkedList?

java - GWT 中的 JSNI 在调用时生成 java.lang.UnsatisfiedLinkError

java - 什么颜色混合算法用于使颜色变暗?

r - 列出具有多个条件的文件第 2 部分

java - spring data cassandra 默认限制 10

java - 使用 Java 在 Solr 中以编程方式完全导入

java - Axis2 生成的 stub 是线程安全的吗?

search - 使用 Lucene.net 索引多语言内容

javascript - 根据网页 javascript 的内容从字典中查找单词的最佳实践

Solr 查询总是返回前 10 行