使用 haystack + jieba 做搜索,无法做到 partial word 搜索? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
timchou
V2EX    Python

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

  •  
  •   timchou 2018 年 4 月 2 日 1871 次点击
    这是一个创建于 2928 天前的主题,其中的信息可能已经有所发展或是发生改变。
    配置 haystack 的时候,如果设置为 CharField,然后 analyzer 指定为 jieba 的 ChineseAnalyzer,那可以做到中文分词搜索,

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

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

    请问大家都是怎么解决这个问题的呢?
    感觉这个场景还是蛮多的。
    4 条回复    2018-04-03 15:48:05 +08:00
    timchou
        1
    timchou  
    OP
       2018 年 4 月 3 日
    自己回答一发,目前解决了,但是不知道解决方案是否是最优:

    使用 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
        2
    maemo  
       2018 年 4 月 3 日
    刚好最近也在做搜索,也是用的 haystack + jieba,但 jieba 的问题就像你说的那样,支持了中文,反而有些英语和数字就搜索不出来了。

    所以我就直接按自带的 engine,发现效果还是能接受。至于你说的 partial word 搜索,我测试了一下发现本身就支持的。
    https://imgur.com/a/3GTYq
    timchou
        3
    timchou  
    OP
       2018 年 4 月 3 日 via iPhone
    @maemo hello 你的意思是 你没有用 jieba 来作分词吗?就用的默认的?
    maemo
        4
    maemo  
       2018 年 4 月 3 日
    @timchou 是的,没用 jieba,中文搜索暂时还没遇到问题
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     943 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 19:22 PVG 03:22 LAX 12:22 JFK 15:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86