【问题标题】:search by name of people with apache solr使用 apache solr 按人名搜索
【发布时间】:2014-05-13 02:08:32
【问题描述】:

我需要创建人名搜索。我已经在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%

【问题讨论】:

  • 我想知道,您在那篇文章中有几个问题,对吧?一是关于您能否获得相似性百分比,二是关于您的现场方法。对吗?
  • @Mysterion 是的。但主要问题是关于百分比。
  • 我所能做的就是向你推荐这篇文章 - wiki.apache.org/lucene-java/ScoresAsPercentages,不确定这是否是你要找的
  • @Mysterion 我不确定这是否是我要找的。我需要以某种方式 Solr / Lucene 让我知道用户输入的内容与我索引的内容有多接近。正如我所说,无法使用分数,因为他的公式会根据我正在搜索的某些单词存在多少文档而有所不同。基本上我需要一个像 dismax 或 ngram 这样的算法的输出,但有些东西。 IE。百分比
  • 哦,我终于得到了你想要的东西。用它来更新您的问题可能是个好主意

标签: search solr lucene fuzzy-search dismax


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 几天前,我问了这个问题:我发现了拼写检查的准确性。您知道拼写检查是否可用于搜索名称和/或符合我的要求吗?老实说,我不知道我是否应该使用拼写检查。抱歉再次打扰您stackoverflow.com/questions/22506782/…
  • 可能,但拼写检查依赖于字典。如果您的索引可以充当您的名称字典(或者您有其他一些标准名称字典),那么它可能对此非常有用,是的。由于拼写检查通常基于语料库中术语的流行程度,而名称往往是不太常见的术语,因此它只取决于索引的构成。
猜你喜欢
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多