solr spellcheck 距离选取方案

来源:互联网 发布:大数据和java的关系 编辑:程序博客网 时间:2024/06/06 20:10

重点:Damerau-Levenshtein


spellcheck本质上工作机制是两步:

1. ngram进行候选检索

2. 选取ngram打分最高的几个,进行距离计算,如果距离大于solrconfig或者请求参数中的accuracy配置项,就返回该纠错结果


之前沿用了默认配置项编辑距离,

<strname="distanceMeasure">org.apache.lucene.search.spell.LevensteinDistance</str>

即插入、删除、替换都对距离加一


这导致了:

搜pool,无法纠错出polo,因为我们的accuracy是0.7,那pool和polo的编辑距离是2,所以他们的相似度是1-2/(max(4,4)),即0.5


而根据用户的输入情形,两个字符的mis-transform,即字符换位是很常见的一种情况,它对应的距离不应该加2,而应该与删除或者插入同等对待


正当我在考虑怎么写这个算法的时候,发现Lucene早就帮我想好了,

LuceneLevenshteinDistance

它计算的是Damerau-Levenshtein

即插入、删除、交换的距离都是1