1、lucene里边,有三个算法去计算拼写纠错的类似度。 算法
一、Edit Distance(编辑距离) 测试
算法原理:从一个字符串A通过增删改的步数,变成另一个字符串B,这个步数最少的时候,就是为A与B以前的 编辑距离。 spa
二、jaro-winkler distance(基于编辑距离的修改) .net
算法原理:两个给定字符串S1和S2的Jaro Distance为: blog
这种算法,减小了因为字符匹配,而字符位置不一样,而形成的影响。 排序
详情参考 :http://blog.csdn.net/chaoswork/article/details/5489877 字符串
三、 Ngram 算法。 get
算法原理:简单的 N元切分。例如,2元,将目标A字符串(假如为 “测试字符串”),就能够分为 “测试”,“试字”,“字符”,“符串”。跟B字符串(“实测字符串”,分为 “实测”,“测字”,“字符”,“符串”。)再比较两个字符串list的的重合次数。 it
2、solr提供 的spell的默认纠错功能,其实要结合业务的话,比较难。 io
默认的,纠错功能是这个样子的: 选取 一个或者多个的 solrspellchecker(根据不一样的算法或者逻辑提供suggestions),而后,合并搜索结果,根据必定规则(默认的规则是先按 编辑距离 排序,再按hit目标的term的个数排序)进行suggestions排序。这样的方法,并无 结合实际的业务,而实际的业务,每每要加入 query的 热度的这个维度。这样业务的东西要插进去的话,就会比较麻烦。选取最好最合适的插入方式,这个很关键,由于如何不选取到最合理的方式的话,极有可能会影响到其它的功能。
3、solr 中的spell的代码逻辑
4、加入对spell修改的具体方法。
一、修改 类似度的算法,加入自定义的类似度算法。
二、修改SuggestWordSorceComparator的 比较方法(toCompare),
三、修改SuggestWord的score的值,这里能够修改 score 为加入本身的业务打分与类似度打分的相加的最终值。 这样子修改,不必定是合理的,可是应该是可行的。
四、修改spellCheckCollation中的internalRank(内部的排序顺序),其是在SpellCheckCollator中的L125中掉做用了。这种状况的修改,是基于spellCheckCollater的最后的将获得的结果再一次调用solrindexSearcher。在这些搜索中,修改原来的termquery为按命中后的打分排序,而不是hits的次数排序。可能要在spellCheckCollation中加入score,记录打分,也可能不须要记录打分,只须要顺序,具体看业务。在 这个地方修改,加入业务打分,不必定是合理的,可是应该是可行的。
5、更具四中的4,深刻代码层的修改
一、因为是调用solrindexSearcher的再次搜索,而原先的solrindexSearcher有可能已是被修改过了,即已经加入了 业务的打分以后的排序,直接能够获得每次搜索的sorce,有可能已是在solrindexSearcher 中search以后的顺序,已是加入了业务的打分以后的排序。可是,加入了业务打分以后的顺序,在search以后获得的response的实例里边,不必定要 results的加业务打分以后的打分 。只有当获得了这些打分以后,才可能才可以在屡次搜索(针对纠错结果集)中获得分数排序。
二、能够在SpellCheckCollator中的L114中的log中获得maxAllSorce
若是要提供跟多的数据以便于业务的须要,这个 first result的的 lucenesorce+busniesssorce就要获得才行