用apache solr搜索人名

时间:2014-04-02 02:38:04

标签: search solr lucene fuzzy-search dismax

我需要创建一个搜索人名。我已经在here看到了很棒的内容,但我需要不同的东西。

这是我的要求。

我试图使用语音搜索,但我需要索引的人的名字是非英文名称。我相信Apache Solr / Lucene实现的语音算法对葡萄牙语单词(我的文化)无效。

之后,我决定使用ngrams进行搜索。它似乎工作,但我需要以某种方式比较用户键入的内容与Solr索引具有的接近程度。我无法使用得分,因为它使用了所有文档中存在某些单词的次数。因此,我需要以某种方式给出一个数字(例如百分比)作为比较的结果,换句话说,用户输入的内容与我在solr上的真实姓名有多接近。

Ps:我将在我的应用程序中使用此结果来使用用户键入的内容或继续使用Solr中存在的内容。

样品:

ID    NAME
1     James Bond
2     James Bond Junior
3     Tony Mellord

该用法可以搜索Jhames Bond并使用Ngrams,1和2都匹配。

PS:我使用英文名称来澄清情景。

有没有办法给出答案:用户键入的内容看起来像我没有使用得分的索引?让我们说:

Jhames Bond looks like James Bond in 97% (for example)
Jhames Bond looks like James Bond Junior in 87%

1 个答案:

答案 0 :(得分:1)

如果您对查询方式感到满意,并且只想提出百分比,则可以使用Levenshtein距离将查询值与索引返回的值进行比较,作为后处理步骤。

在Apache Commons中有一个Levenshtein距离算法的实现:StringUtils.getLevenshteinDistance

最大可能距离是最长字符串的长度比较,因此获得百分比可能如下所示:

1-(StringUtils.getLevenshteinDistance(str1, str2) / Math.max(str1.length(), str2.length()));

Jaro-Winkler距离(StringUtils.getJaroWinklerDistance)也可能是一种更好的算法,而且比较简单,因为它已经被标准化,因此它可以表示为百分比。它似乎也更接近您提供的示例值。