3

问题描述

我正在尝试实现一个自定义算法,以匹配用户提供的自由文本输入,一个公司名称,如“福特汽车”,与一个由 140 万个公司名称组成的参考数据源。

该算法执行以下步骤:

步骤 1)执行“精确匹配”,然后是“开始匹配”,最后是用户提供的搜索输入的“包含匹配”。此步骤的结果也按相同顺序排序。

步骤 2)将搜索输入与参考公司名称进行逐个令牌匹配。

每个令牌都按以下顺序匹配:精确、开始、包含、Levenshtein 距离 (< 0.2) 和 Refined Soundex。

例如,如果用户输入是“Food Motur Holding”并且它正在与“The Ford Motor Holdings Company”进行匹配,那么第一个令牌“Food”将根据 Soundex 匹配匹配“Ford”,第二个令牌“Motur”将匹配“Motor”基于编辑距离算法和最后一个令牌“Holding”将通过 Begins 匹配匹配“Holdings”。

评分: 每个令牌匹配首先按照匹配技术评分的等级进行评分,精确匹配是最好的,Soundex 是最差的。

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

我的部分解决方案

我在 solr 中实现了一个简单的模式来存储参考公司名称。一个字符串字段(称为 companyName)、一个从字符串复制的简单文本字段(称为 companyText)和另一个从字符串复制的文本字段(称为 companySoundex)并使用 PhoneticFilterFactory 进行基于精制 Soundex 的匹配。

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

对于第 2 步)我计划向 solr 服务器发起 3 个并行查询。第一个查询在 companyText 字段上执行简单的文本搜索,第二个查询在 companyText 字段上使用 ~ 运算符执行模糊匹配,第三个查询在 companySoundex 字段上执行 soundex 匹配。我计划以某种方式组合这 3 个并行查询的结果以获得所需的最终结果。

问题:

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

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

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

4

2 回答 2

0

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

于 2013-04-18T08:13:30.940 回答
0

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

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

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

于 2012-01-07T17:08:44.400 回答