我正在设置一个基于solr搜索的重复数据删除系统,该系统将返回与搜索条件匹配的搜索结果。我使用了dataimport处理程序从数据库中提取数据并在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模式。
提前致谢!!
答案 0 :(得分:9)
如果你想要的是基于Lucene的客户重复数据删除系统,你可能只想使用Duke。它是一个通用的重复数据删除引擎,它使用Lucene对记录编制索引,然后使用更复杂的比较器(如Levenshtein,Weighted Levenshtein,Jaro-Winkler等)进行详细比较。它有JDBC数据库等的标准连接器,但您也可以自己编写,甚至直接为引擎提供数据。比较基于将概率与贝叶斯定理相结合。
根据我写杜克的经历,我会说你很难让Lucene为你做所有的工作。正如你所说,搜索结果相当不错,但精度并不像你专门为此设计的算法那样精确。
所以我向你推荐的是获得一个专为重复数据删除而构建的工具。我之所以提到Duke是因为它基于Lucene并且与您正在尝试构建的内容非常接近,但您可以使用任何record linkage引擎。 Duke使用Lucene来提高性能(所以我们不必比较所有记录对),但是其他引擎有其他方法可以在不使用搜索的情况下实现类似的性能,我猜你Lucene是否在内部并不重要。因此,上面链接的记录链接页面上列出的任何工具都可以为您服务。
请注意,这几十年来一直是一个巨大的研究领域,人们在解决这个问题上取得了很好的进展。所以现成的工具确实很好。还有一堆商业工具,但是既然你已经开始构建自己的工具,我认为这些工具并不相关。
完全披露:我是杜克的作者。我想我们不应该在这里宣传自己,但是,对我而言,使用现成的包装比制造自己的包装好得多。 YMMV。
答案 1 :(得分:0)
您正在构建的查询似乎是
customer_id OR fname OR someOther
如果你需要让其他字段得到委托,你需要更改一下这样的查询(union od customer_id和fname with should operator)
(customer_id AND fname) OR someOther
您可以搜索以下网站以获取更多信息