1

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

这是我的要求。

我尝试使用拼音搜索,但我需要索引的人名不是英文名字。我相信 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%
4

1 回答 1

2

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

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

最大可能距离将是比较的最长字符串的长度,因此要获得百分比可能类似于:

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

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

于 2014-04-02T15:52:59.803 回答