2012-01-07 25 views
2

问题描述如何实现SOLR复杂令牌匹配算法

我想实现一个自定义的算法来匹配用户提供自由文本输入,公司名称,如“福特汽车“,对照由140万个公司名称组成的参考数据源。

该算法执行以下步骤:

步骤1)执行一个“完全匹配”,接着是“开始比赛”,最后“包含匹配”用户提供的搜索输入的。这一步的结果也按照相同的顺序排序。

步骤2)通过搜索输入的令牌匹配和参考公司名称执行令牌。

每个标记按以下顺序匹配:确切,开始,包含,Levenshtein距离(< 0.2)和精制Soundex。

E.g.如果用户输入是“Foord Motur Holding”,并且与“福特汽车控股公司”相匹配,则第一个标记“Foord”将基于Soundex匹配匹配“Ford”,第二个标记“Motur”将匹配基于Edit的“Motor”距离算法和最后一个令牌“Holding”将通过开始匹配匹配“Holdings”。

评分: 每个令牌的比赛是第一得分上率匹配技术规模,以精确匹配是最好的和探测是最差的。

通过计算各个令牌匹配分数的加权平均值,计算整体分数,范围为0-100%。权重是根据令牌的索引顺序来分配的,即第一个令牌的权重最高,最后一个令牌的权重最低。

我的部分解决方案

我实现了一个简单的模式Solr中存储全球化志愿服务青年的公司名称。字符串字段(称为companyName),从字符串复制的简单文本字段(称为companyText)和从字符串复制的另一个文本字段(称为companySoundex),并使用PhoneticFilterFactory进行基于精炼Soundex的匹配。

我已经能够在单个solr查询中复制步骤1)。

对于步骤2)我打算启动3个并行查询solr服务器。第一个查询在companyText字段执行简单文本搜索,第二个查询在companyText字段使用〜运算符执行模糊匹配,第三个查询在companySoundex字段执行soundex匹配。我计划以某种方式组合来自这3个并行查询的结果以获得期望的最终结果。

问题:

1)是否有更好的方式来复制原始算法的步骤2)?

2)即使我用我的“三并行查询”方法,那么如何获得“正确”的排序顺序,因为我得到的原始算法? 我想主要的问题是如何比较这3个完全不同的查询的solr得分来做最后的结果组合

感谢您阅读这个长的问题。任何帮助/指针将不胜感激。

回答

0

看看DisMax查询解析器。 http://wiki.apache.org/solr/DisMaxRequestHandler

对于每个单独的查询,您实际上都会在索引中为匹配建立单独的字段。然后使用DisMax以加权方式组合查询。

我建议现在放弃你的3个并行查询方法。上次我研究这个问题时,不可能将2个独立查询的分数联系起来。它只是不起作用。如果你想要一组结果按分数排序,你必须弄清楚如何在单个查询中完成这些。

+0

我对我的第一个查询使用edismax语法分析器进行全字符串匹配(请参阅步骤1),如下所示:q =(* FORD \ MOTOR *)&qf = companyName&defType = edismax&bq =(companyName:FORD \ MOTOR *)^20bf = FieldLength参数(的companyName)。 Boost查询将Exact和Begins匹配推送到基于Contains的匹配上方。查询的这一部分需要最长的时间,因为我通过比较查询时间和不查找时间来发现。所以我认为,如果我将3个查询结合在一起并尝试使用多个bq和bf值进行提升,性能可能不可接受。谢谢。 – 2012-01-07 18:04:39

0

恕我直言,在Solr提供的开箱即用处理程序中无法实现此功能。你应该更好地编写一个自定义的查询处理程序,以这种方式处理和评分结果。