4

我有一长串单词,我将它们放入一个非常简单的 SOLR / Lucene 数据库中。我的目标是从单项查询列表中找到“相似”单词,其中“相似性”具体理解为 (damerau) levensthein 编辑距离。我了解 SOLR 为拼写建议提供了这样的距离。

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

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

我用来定义一个字段

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

我想搜索这个字段并根据他们的编辑距离返回结果。但是,当我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)

显然,对于我的应用,词频、idfs 等是没有意义的,因为每个文档只包含一个词。我尝试使用拼写建议组件,但没有设法让它返回实际的相似度分数。

任何人都可以提供提示如何配置 SOLR 以执行 levensthein / jaro-winkler / n-gram 搜索并返回分数并且不做额外的东西,比如,tf等等?在某处是否有 SOLR 的基本配置示例?我发现选项的数量确实令人生畏。idfboost

4

3 回答 3

7

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

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

更多细节在这里这里

于 2010-09-01T18:09:57.943 回答
2

如何配置 SOLR 以执行 levensthein / jaro-winkler / n-gram 搜索并返回分数,而无需执行 tf、idf、boost 等附加内容?

您已经获得了一些有关如何获得所需结果的解决方案,但没有一个真正回答您的问题。

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

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

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

于 2014-11-24T15:59:37.310 回答
2

Solr/Lucene 似乎不适合这个应用程序。你可能会过得更好。使用SimMetrics 库。它提供了一套全面的字符串距离计算器,包括。雅罗-温克勒、列文斯坦等。

于 2010-09-02T01:16:00.007 回答