问题说明
我正在尝试实施自定义算法,以匹配用户提供的自由文本输入,公司名称(例如“Ford Motor”)与包含140万公司名称的参考数据源。
该算法执行以下步骤:
步骤1)执行“完全匹配”,然后执行“开始匹配”,最后执行用户提供的搜索输入的“包含匹配”。此步骤的结果也按相同顺序排序。
步骤2)通过参考公司名称的搜索输入的令牌匹配执行令牌。
每个标记按以下顺序匹配:Exact,Begins,Contains,Levenshtein Distance(< 0.2)和Refined Soundex。
E.g。如果用户输入的是“Foord Motur Holding”并且它与“福特汽车控股公司”匹配,则第一个标记“Foord”将匹配基于Soundex匹配的“Ford”,第二个标记“Motur”将匹配基于Edit的“Motor”距离Algo和最后一个标记“Holding”将通过Begins匹配匹配“Holdings”。
得分: 每个令牌匹配首先按照对匹配技术进行评级的比例进行评分,其中Exact匹配最好,Soundex是最差的。
通过计算各个令牌匹配分数的加权平均值,以0-100%的等级计算总分。基于令牌的索引顺序来分配权重,即第一令牌具有最高权重而最后令牌具有最低权重。
我的部分解决方案
我在solr中实现了一个简单的架构来存储referance公司名称。 String字段(称为companyName),从字符串复制的简单文本字段(称为companyText)和从字符串复制的另一个文本字段(称为companySoundex),并使用PhoneticFilterFactory进行基于Refined Soundex的匹配。
我已经能够在单个solr查询中复制步骤1)。
对于步骤2)我计划向solr服务器发出3个并行查询。第一个查询在companyText字段上执行简单文本搜索,第二个查询使用companyText字段上的〜运算符执行模糊匹配,第三个查询在companySoundex字段上执行soundex匹配。我计划以某种方式组合这3个并行查询的结果,以获得所需的最终结果。
问题:
1)是否有更好的方法来复制原始算法的步骤2)?
2)即使我使用“三个并行查询”方法,然后如何获得原始算法中的“正确”排序顺序? 我想主要的问题是如何比较这三个完全不同的查询中的solr得分来做最终的结果组合
感谢您阅读这个长期的问题。任何帮助/指针将不胜感激。
答案 0 :(得分:0)
查看DisMax查询解析器。 http://wiki.apache.org/solr/DisMaxRequestHandler
对于每个单独的查询,您实际上将在索引中构建单独的字段以进行匹配。然后使用DisMax以加权方式组合查询。
我建议现在放弃你的3个并行查询方法。上次我调查此内容时,无法将两个独立查询的分数联系起来。它只是不起作用。如果您想要按分数排序的单组结果,则必须弄清楚如何在单个查询中执行此操作。
答案 1 :(得分:0)
恕我直言,Solr提供的开箱即用处理程序无法实现此功能。编写自定义查询处理程序时,您应该更好,该处理程序以这种方式处理和评分结果。