【问题标题】:What are the best practices to create a solr based de-duplication system?创建基于 solr 的重复数据删除系统的最佳实践是什么?
【发布时间】:2012-09-04 09:54:25
【问题描述】:

我正在设置一个基于 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"  />

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

<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 架构。

提前致谢!!

【问题讨论】:

  • 您的疑问和他们的回答是什么?

标签: java search solr lucene deduplication


【解决方案1】:

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

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

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

请注意,几十年来,这一直是一个巨大的研究领域,人们在解决这个问题上取得了很好的进展。所以现成的工具确实不错。也有很多商业工具可以做到这一点,但自从你开始构建自己的工具后,我认为这些工具并不相关。

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

【讨论】:

  • 您是否考虑过将 Duke 贡献给 Solr 社区?
  • 我不确定这是个好主意,因为 Duke 在 Solr 之外还有很多用途。已经有各种尝试为其构建 Solr 插件,我认为这是一个更好的方法。
【解决方案2】:

看来您正在构建的查询类似于

customer_id OR fname OR someOther

如果您需要涉及其他字段,则需要更改查询(union od customer_id and fname with should operator)

(customer_id AND fname) OR someOther

您可以搜索以下网站以获取更多信息

【讨论】:

  • 不,事实并非如此。我尝试通过 solr 管理界面进行搜索,我正在使用两个字段“查询字符串”和“过滤查询”,它们使用“AND”进行操作
  • 你有没有找到一种方法来搜索查询结果的分数。如果他们得分高而其他人得分低,则可能再次发生这种情况..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 2013-05-17
相关资源
最近更新 更多