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

时间秒杀一切 提交于 2019-12-09 14:27:43

前言

很少有朋友写相关haystack与whoosh的文章,更没有一个较好的示例。所以我把这个完整的示例开源了,希望有兴趣的同学能够交流。示例网站

解决的问题:

  1. 不同字段的优先级,比如Title比Content高。(haystack的whoosh backend默认不支持此功能)
  2. 相关性搜索(more_like_this)功能
  3. 能结合mysql数据库使用
  4. 解决中文分词功能(可以用我自己的yaha分词,或者结巴分词)
  5. 实现了更好的ChineseAnalyzer,这个的测试地址
  6. 使用whoosh 2.5.1。默认haystack使用whoosh2.4,用2.5会报错
  7. 修正了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, ignore=None,cachesize=cachesize)
使用 yaha分词请小小的修正以下代码:
#analyzer.py
_cuttor = Cuttor()
_cuttor.set_stage1_regex(re.compile('(\d+)|([a-zA-Z]+)', re.I|re.U))
#注释这里,把名字发现去掉。
#_cuttor.add_stage(SurnameCutting())
#_cuttor.add_stage(SuffixCutting())

class ChineseTokenizer(Tokenizer):

就是把名字发现功能与地名给去掉了,免得搜索刘德的时候无法得到刘德华的结果。当然后续优化speling功能之后,可能有更好的解决办法。

建议别开启spelling功能,因为这样搜索速度会下降10+倍。原来可能是whoosh本身的spelling模块实现得不好。这个功能后续会想办法补上。

有一些功能haystack不好实现,便直接修改whoosh_cn_backend.py,从实现角度来说不大好,但他本来只是学习示例嘛,将就。

目前没开放爬虫代码,很多数据都从豆瓣爬过来。如果大家想要数据库数据,可以在下面留言。

开源地址 以下是代码的readme:

haysearch

A movie search using haystack and whoosh. 一个使用haystack 与whoosh的电影搜索站。使用whoosh的人很少,我用着用着就越来越喜欢。 网上虽然有很多对whoosh的测试,如果要看运行效果或看如何去使用whoosh,可以参考这个网站的源代码:http://www.v-find.com 这个网站仅限于自己与几个朋友使用,所以可能没多久就关了:)

haystack修改

把whoosh_cn_backend.py放入到搜索项目 haystack/backend/ 文件夹下 对这个项目有兴趣可到我的博客:http://www.oschina.net/ 交流

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!