Django+whoosh 全文检索中文分词问题
django使用whoosh全文检索,到处都是坑。如果用java来写,那就方便多了。
第一个坑,中文不支持
只能自己改下源码。使用了jieba的中文分词
第二个坑
搜索关键词问题,假如索引中有以下数据:
Java是世界上最好的语言
Django是最好用的web框架,但是处处是坑
我们尝试着输入关键词搜索,例如:java、django这种单个关键词都可以准确的返回数据,
如我想用一句话来搜索:“java是哪个国家发明的语言呢”
看看分词器的结果:
所有1中 java、是、的、语言,这几个词都匹配,其中:是、的,是停用词,剩下的就是 java、国家、发明、语言这两个词
但是你会发现搜索不到结果,你用单个词就可以搜索到。
这是因为whoosh 内置使用的操作符是AND,也就是必须同时满足你分词后的词语。多一个都不行。
那如果这样的话全文检索是没有任何意义的。于是在官方文档找到了一句这样的配置:
HAYSTACK_DEFAULT_OPERATOR = 'OR'
settings.py中加入默认操作符配置。
配置好了之后,进行搜索还是不行,默认还是AND操作符。
调试分析,这会从settings.py中取到我们预设的操作符:
但是在构造查询的时候 还是使用的AND
实在不解设置了没效,那官方还说这样做有什么意义。在Google之后,很多人都有这样的问题。
大部分人的解决方案是自己重写view 然后构造自己的queryset
没办法,只能自己重写查询的部分了。