如何配置Solr/Lucene以执行Levenshtein编辑距离搜索?

4

我有一个很长的单词列表,我将它们放入了一个非常简单的SOLR / Lucene数据库中。我的目标是针对单个术语查询从列表中找到“相似”的单词,其中“相似性”特别理解为(Damerau)Levenshtein编辑距离。我知道SOLR提供了这样的拼写建议距离。

在我的SOLR schema.xml中,我配置了一个字段类型string

<fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>

我用它来定义一个字段

<field name='term' type='string' indexed='true' stored='true' required='true'/>

我希望能够搜索这个字段,并根据它们的Levenshtein编辑距离返回结果。然而,当我运行像webspace~0.1这样的查询时,通过启用调试和解释功能,SOLR报告显示计算分数需要考虑很多因素,例如:

"1582":"
1.1353534 = (MATCH) sum of:
  1.1353534 = (MATCH) weight(term:webpage^0.8148148 in 1581), product of:
    0.08618848 = queryWeight(term:webpage^0.8148148), product of:
      0.8148148 = boost
      13.172914 = idf(docFreq=1, maxDocs=386954)
      0.008029869 = queryNorm
    13.172914 = (MATCH) fieldWeight(term:webpage in 1581), product of:
      1.0 = tf(termFreq(term:webpage)=1)
      13.172914 = idf(docFreq=1, maxDocs=386954)
      1.0 = fieldNorm(field=term, doc=1581)

显然,对于我的应用程序而言,术语频率、idf等都是无意义的,因为每个文档只包含一个单词。我尝试使用拼写建议组件,但未能使其返回实际的相似度分数。
请问有人能提供提示如何配置SOLR以执行Levensthein / Jaro-Winkler / N-Gram搜索并返回分数,且不需要执行其他额外的操作,如tf、idf、boost等吗?是否有一个针对SOLR的简洁配置示例?我发现选项的数量真的很令人生畏。
3个回答

7

如果您正在使用夜间构建版本,则可以使用strdist函数根据Levenshtein距离对结果进行排序:

q=term:webspace~0.1&sort=strdist("webspace", term, edit) desc

更多细节请看这里这里


1
只是补充一下,对于Solr 3.1之前的所有版本,这对于所有发布版本都是正确的,不再需要运行夜间构建。 - ilinca

2
如何配置SOLR以执行Levenstein / Jaro-Winkler / n-gram搜索并返回分数,而不进行其他额外的操作,如tf、idf、boost等?您有一些解决方案可以获得所需的结果,但没有一个实际回答了您的问题。 q = {! func} strdist(“webspace”,term,edit)将使用Levenstein距离覆盖默认文档评分,q = {! func} strdist(“webspace”,term,jw)对Jaro-Winkler执行相同的操作。 上面建议的排序在大多数情况下都可以正常工作,但它不会改变评分函数,它只是按照您想要避免的评分方法对获得的结果进行排序。这可能会导致不同的结果,并且组的顺序可能不同。通过&debugQuery=true可以看到哪些最适合。

2

Solr/Lucene似乎不适合这个应用程序。你可能更好地使用SimMetrics库。它提供了一套全面的字符串距离计算器,包括Jaro-Winkler、Levenstein等。


这是一个非常有趣的链接。我希望Python也有像这个标准库一样全面的库。不幸的是,由于我需要搜索数十万个单词,没有索引的解决方案可能会太慢(但我必须先尝试)。此外,我不太确定如何将Java库集成到我的Python项目中。也许可以通过HTTP实现。 - flow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接