1

我正在建立一个基于 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 架构。

提前致谢!!

4

2 回答 2

9

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

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

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

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

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

于 2012-09-26T09:25:55.057 回答
0

您正在构建的查询似乎类似于

customer_id OR fname OR someOther

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

(customer_id AND fname) OR someOther

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

于 2012-09-04T10:48:22.610 回答