问题描述
我正在尝试实现一种自定义算法,以将用户提供的自由文本输入(如"福特汽车")与由140万个公司名称组成的参考数据源相匹配。
算法执行以下步骤:
步骤1)执行用户提供的搜索输入的"精确匹配",然后是"开始匹配",最后是"包含匹配"。此步骤的结果也按相同的顺序进行排序。
步骤2)执行搜索输入与参考公司名称的逐令牌匹配。
每个令牌按以下顺序匹配:Exact、Begins、Contains、Levenstein Distance(<0.2)和Refined Soundex。
例如,如果用户输入是"Foord Motur Holding",并且它与"The Ford Motor Holdings Company"匹配,则第一个令牌"Foord"将基于Soundex匹配匹配匹配"Ford",第二个令牌"Motur"将基于Edit Distance Algo匹配"Motor",最后一个令牌"Holding"将通过Begins匹配匹配匹配到"Holdings"。
评分:每一场代币比赛都会首先根据匹配技术的评分标准进行评分,Exact比赛是最好的,Soundex是最差的。
通过计算个人代币匹配分数的加权平均值,以0-100%的比例计算总分数。权重是根据令牌的索引顺序分配的,即第一个令牌具有最高权重,最后一个令牌具有最低权重。
我的部分解决方案
我在solr中实现了一个简单的模式来存储引用公司名称。一个字符串字段(称为companyName)、一个从字符串复制的简单文本字段(称称为companyText)和另一个从串复制的文本字段(也称为companySoundex),并使用PhoneticFilterFactory进行基于精化Soundex的匹配。
我已经能够在一个solr查询中复制步骤1)。
对于步骤2),我计划向solr服务器启动3个并行查询。第一个查询在companyText字段上执行简单的文本搜索,第二个查询在companyText字段上使用~运算符执行模糊匹配,第三个查询在companySoundex字段上执行soundex匹配。我计划以某种方式将这3个并行查询的结果组合起来,以获得所需的最终结果。
问题:
1) 有没有更好的方法来复制原始算法的步骤2)?
2) 即使我采用"三个并行查询"的方法,那么如何获得与原始算法相同的"正确"排序顺序?我想主要的问题是如何比较这3个完全不同的查询的solr分数,以进行结果的最终组合
谢谢你阅读这个长问题。如有任何帮助/建议,我们将不胜感激。
查看DisMax查询解析器。http://wiki.apache.org/solr/DisMaxRequestHandler
对于每个单独的查询,您实际上都会在索引中建立单独的字段进行匹配。然后使用DisMax以加权方式组合查询。
我建议现在放弃你的3个并行查询方法。上次我研究这个问题时,不可能将两个单独查询的分数联系起来。它就是不起作用。如果你想要一组按分数排序的结果,你必须弄清楚如何在一个查询中做到这一点。
IMHO,此功能无法在Solr提供的开箱即用处理程序中实现。您应该更擅长编写一个自定义查询处理程序,以这种方式处理结果并对结果进行评分。