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-04-02 23:44:01 +08:00 · 1478 次点击
    这是一个创建于 2187 天前的主题,其中的信息可能已经有所发展或是发生改变。
    配置 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-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
        2
    maemo  
       2018-04-03 14:22:59 +08:00
    刚好最近也在做搜索,也是用的 haystack + jieba,但 jieba 的问题就像你说的那样,支持了中文,反而有些英语和数字就搜索不出来了。

    所以我就直接按自带的 engine,发现效果还是能接受。至于你说的 partial word 搜索,我测试了一下发现本身就支持的。
    https://imgur.com/a/3GTYq
    timchou
        3
    timchou  
    OP
       2018-04-03 15:41:35 +08:00 via iPhone
    @maemo hello 你的意思是 你没有用 jieba 来作分词吗?就用的默认的?
    maemo
        4
    maemo  
       2018-04-03 15:48:05 +08:00
    @timchou 是的,没用 jieba,中文搜索暂时还没遇到问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1127 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 18:46 · PVG 02:46 · LAX 11:46 · JFK 14:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.