我有一个很长的单词列表,我把它放入一个非常简单的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搜索并返回分数,不用执行其他内容,例如tf
,idf
,boost
等包括在内? SOLR在哪里有一个简单的配置样本?我发现选项的数量确实令人生畏。
答案 0 :(得分:6)
如果你正在使用每晚构建,那么你可以使用strdist函数根据levenshtein距离对结果进行排序:
q=term:webspace~0.1&sort=strdist("webspace", term, edit) desc
答案 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
可能就足够了。