timchou
2018-04-03 13:26:25 +08:00
自己回答一发,目前解决了,但是不知道解决方案是否是最优:
使用 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 的文档。