1
timchou OP 自己回答一发,目前解决了,但是不知道解决方案是否是最优:
使用 jieba 分词,目前看来是不支持 Ngram 的,也就是说,如果对 Document=True 的字段设置为 NgramField,则中英文分词会有问题,比如 [施华洛世奇 Swarovski ] ,你就搜不到了。 但是如果不用 NgramField,那对于 partial word 搜索,就不行,比如 Swarovski,你搜索 warov 就搜不到。 我现在的解决办法是,对于 Document=True 的字段还是用 CharField,然后另外增加几个你需要搜索的字段,类型为 NgramField,然后改写自己写 form: class CustSearchForm(SearchForm): def search(self): sqs = super(CustSearchForm, self).search() if 'q' in self.cleaned_data: q = self.cleaned_data['q'] sqs = sqs.filter_or(EAN=q).\ filter_or(SKU=q).\ filter_or(brand=q) return sqs 这里的 trick 是使用 filter_or,这个可以查看下 haystack 的文档。 |
2
maemo 2018-04-03 14:22:59 +08:00
刚好最近也在做搜索,也是用的 haystack + jieba,但 jieba 的问题就像你说的那样,支持了中文,反而有些英语和数字就搜索不出来了。
所以我就直接按自带的 engine,发现效果还是能接受。至于你说的 partial word 搜索,我测试了一下发现本身就支持的。 https://imgur.com/a/3GTYq |