使用 haystack + jieba 做搜索,无法做到 partial word 搜索?

2018-04-02 23:44:01 +08:00
 timchou
配置 haystack 的时候,如果设置为 CharField,然后 analyzer 指定为 jieba 的 ChineseAnalyzer,那可以做到中文分词搜索,

但是比如对应数字 [ 123456789 ] ,你搜索 3456 就搜不到,英文也是,对于单词 [ hello ] ,你搜 ello 搜不到。

查询文档后,说可以把 CharField 改为 NgramField 类型,改了之后确实可以了,但是中文分词就不行了。

请问大家都是怎么解决这个问题的呢?
感觉这个场景还是蛮多的。
1493 次点击
所在节点    Python
4 条回复
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 的文档。
maemo
2018-04-03 14:22:59 +08:00
刚好最近也在做搜索,也是用的 haystack + jieba,但 jieba 的问题就像你说的那样,支持了中文,反而有些英语和数字就搜索不出来了。

所以我就直接按自带的 engine,发现效果还是能接受。至于你说的 partial word 搜索,我测试了一下发现本身就支持的。
https://imgur.com/a/3GTYq
timchou
2018-04-03 15:41:35 +08:00
@maemo hello 你的意思是 你没有用 jieba 来作分词吗?就用的默认的?
maemo
2018-04-03 15:48:05 +08:00
@timchou 是的,没用 jieba,中文搜索暂时还没遇到问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/443737

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX