如何配置solr / lucene来执行levenshtein编辑距离搜索?

时间:2010-09-01 15:39:15

标签: lucene solr levenshtein-distance

我有一个很长的单词列表,我把它放入一个非常简单的SOLR / Lucene数据库中。我的目标是从列表中为单项查询找到“相似”的单词,其中“相似性”特别理解为(damerau)levensthein编辑距离。我知道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编辑距离返回结果。但是,当我通过调试和解释对SOLR运行webspace~0.1之类的查询时,报告显示计算得分时需要考虑大量因素,例如:

"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搜索并返回分数,不用执行其他内容,例如tfidfboost等包括在内? SOLR在哪里有一个简单的配置样本?我发现选项的数量确实令人生畏。

3 个答案:

答案 0 :(得分:6)

如果你正在使用每晚构建,那么你可以使用strdist函数根据levenshtein距离对结果进行排序:

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

更多详情herehere

答案 1 :(得分:1)

Solr / Lucene似乎不适合这个应用程序。你可能会更好。与SimMetrics library。它提供了一套全面的弦距计算器,包括。 Jaro-Winkler,Levenstein等。

答案 2 :(得分:1)

  

如何配置SOLR以执行levensthein / jaro-winkler / n-gram   搜索返回的分数,而不做其他的事情,如   tf,idf,boost等包括在内?

你有一些如何获得所需结果的解决方案,但实际上没有人回答你的问题。

q={!func}strdist("webspace",term,edit)将覆盖Levenstein距离的默认文档评分,q={!func}strdist("webspace",term,jw)对Jaro-Winkler执行相同的评分。

上面建议的排序在大多数情况下都可以正常工作,但它不会改变评分功能,它只是根据您想要避免的评分方法对结果进行排序。这可能会导致不同的结果,并且组的顺序可能不同。

要查看哪些最适合&debugQuery=true可能就足够了。