yaha

django+haystack+whoosh+分词库=搜索站

时间秒杀一切 提交于 2019-12-09 14:27:43
前言 很少有朋友写相关haystack与whoosh的文章,更没有一个较好的示例。所以我把这个完整的 示例开源 了,希望有兴趣的同学能够交流。 示例网站 解决的问题: 不同字段的优先级,比如Title比Content高。(haystack的whoosh backend默认不支持此功能) 相关性搜索(more_like_this)功能 能结合mysql数据库使用 解决中文分词功能(可以用我自己的yaha分词,或者结巴分词) 实现了更好的 ChineseAnalyzer,这个的 测试地址 使用whoosh 2.5.1。默认haystack使用whoosh2.4,用2.5会报错 修正了haystack+whoosh2.5.1的搜索词纠正功能,默认用老的Spelling API,在whoosh2.5.1下不支持。 同时注意: 如果使用结巴分词默认的ChineseAnanlyzer,请修改代码如下会更好: def ChineseAnalyzer(stoplist=STOP_WORDS,minsize=1,stemfn=stem,cachesize=50000): return ChineseTokenizer()|LowercaseFilter()|StopFilter(stoplist=stoplist,minsize=minsize)\ |StemFilter(stemfn=stemfn

词语纠错原理简介(corrector, do you mean?)

强颜欢笑 提交于 2019-12-07 17:40:44
当在google百度输入错误的时候,百度google等都能给出一个最相近的纠错的提示。这个功能非常好用,也觉得特别有意思,所以在设计一个搜索小站的时候,想把这个功能加上。 在google上搜"spelling corrector"会得到很多有用的信息,大概有两种实现:一种是基于N-GRAM,另外一种是基于状态跳转来实现。python的Whoosh库2.4版本之前使用的是N-GRAM方式,而2.5之后使用的是FST状态跳转的方式。个人觉得基于FST可能会更好一些,下面简单介绍它的原理: 假设词库里有:刘德华 刘青云 刘嘉玲 刘俊杰 刘玉玲 刘易斯 刘松仁 刘以达,用户输入的是刘牛德,这个时候应该给用户的输入进行一次较正,以更合适本站的搜索信息。校正方法: 1、删除法,把刘牛德变成-->刘牛 牛德,再对库里的词典进行搜索 2、交换法,把刘牛德变成 刘德牛等,再进行搜索 3、替换法,把刘牛德变成 刘羊德,刘马德,刘牛法等 4、插入法,变成刘牛德国等 通过设计一外良好的状态图,以更好的实现上边的算法,就是如这个 链接所示 循环的使用上边的四种状态的跳转,每增加一次变化,词的距离也相识的+1,比如刘牛德变成了刘德华,就经过一次交换,再一次替换,词距也增加到了2. 更详细的原理介绍: 此英文文章 借助Whoosh的corrector实现一个更友好速度更快的 中文纠错算法 测试地址