重点: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