请问 Flask-WhooshAlchemy 支持中文检索是有问题吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
toono
V2EX    Flask

请问 Flask-WhooshAlchemy 支持中文检索是有问题吗?

  •  
  •   toono
    ToonoW 2016-04-26 20:23:12 +08:00 7623 次点击
    这是一个创建于 3455 天前的主题,其中的信息可能已经有所发展或是发生改变。

    因为需要用到全文搜索,所以用了 Flask-WhooshAlchemy ,按照外国 blog 的说明完成了配置,然后尝试检索,但是只有检索英文的时候才有效,如果检索的关键字是中文就会返回空数组的结果了。

    所以想请问一下有什么方法能解决么?

    17 条回复    2017-05-27 13:35:19 +08:00
    toono
        1
    toono  
    OP
       2016-04-26 21:46:46 +08:00
    手动顶置~
    neo1218
        2
    neo1218  
       2016-04-26 21:58:40 +08:00   1
    是的, flask-whooshalchemy 内置的分词中文分词不行。建议使用 jieba 分词先创建分词表,然后再用 flask-whooshalchemy 对分词表进行关键字搜索。
    toono
        3
    toono  
    OP
       2016-04-26 22:39:56 +08:00
    @neo1218
    我后来也查到大概要用 jieba 来进行分词了,但是我不确定是不是只要添加一个 analyzer 的字段就好了,应该是会自动分词吧?
    这是我 model 的代码:
    ```python
    class Post(db.Model):
    __tablename__ = 'posts'
    __searchable__ = ['title'] # these fields will be indexed by whoosh
    __analyzer__ = ChineseAnalyzer()
    ```

    但是我这样子设置之后还是不能进行中文搜索,纯英文的搜索是没问题的。

    求老司机再给点提示**:....:*'(**)'*:.. ..:**
    toono
        4
    toono  
    OP
       2016-04-27 13:08:19 +08:00
    真心希望有解答,再次手动, sorry
    toono
        5
    toono  
    OP
       2016-04-28 22:07:27 +08:00
    算是解决了,不过我只是基础使用,并没有深究。下面说说怎么做。

    我先说说困难。
    1. 原版的 Flask-WhooshAlchemy 并没有支持 python3 ,所以用 py3 的同学不能够通过 pip 直接安装使用。
    2. 后来找到了 miguelgrinberg 的修改版,可以在 python3 上使用,但是在用了 jieba 分词系统的情况下还是不能够支持中文全文搜索。
    3. 再后来找到了修改版 Flask-WhooshAlchemyPlus ,但是 README 文档上的步骤教程几乎完全参照原版文档,在我的情况下并不能正常使用。

    接下来直接上步骤简要说明:
    1. 安装 Flask-WhooshAlchemyPlus ,地址在 https://github.com/Revolution1/Flask-WhooshAlchemyPlus
    2. 参照 miguelgrinberg 的文章进行设置 http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-x-full-text-search

    这样子新的数据库 commit 都会被记录加入 whoosh 的索引中,也就是设置好 whoosh 之后 commit 的记录才能够被检索到。
    toono
        6
    toono  
    OP
       2016-05-26 15:32:21 +08:00
    还有点比较重要,在配置好全文检索之后加入的记录才回创建搜索索引,也就是配置好之后的新记录才能被搜索。
    revol
        7
    revol  
       2016-06-18 23:57:12 +08:00
    @toono 为啥不能正常用呢~
    toono
        8
    toono  
    OP
       2016-06-19 00:16:53 +08:00
    @revol whoosh 不支持 py3 , flask-whooshalchemy 内置的中文分词有问题。
    revol
        9
    revol  
       2016-06-29 00:09:15 +08:00
    @toono 我更新了个版本,修复了一些 bug 你可以再试试看
    toono
        10
    toono  
    OP
       2016-07-05 10:38:07 +08:00
    @revol wow!原来是你作者~
    之前没发现哈哈哈
    boyxy120
        11
    boyxy120  
       2016-12-03 10:52:38 +08:00
    @revol 运行的时候报错了
    Traceback (most recent call last):
    File "app.py", line 28, in <module>
    flask_whooshalchemyplus.init_app(app)
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/Flask_WhooshAlchemyPlus-0.7.5-py3.4.egg/flask_whooshalchemyplus.py", line 423, in init_app
    whoosh_index_all(app)
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/Flask_WhooshAlchemyPlus-0.7.5-py3.4.egg/flask_whooshalchemyplus.py", line 372, in whoosh_index_all
    'sqlalchemy'].db.Model._decl_class_registry.values()
    KeyError: 'sqlalchemy'
    zxiaobaideMacBook-Air:biaojiepay_shop zxiaobai$ python3 app.py server
    Traceback (most recent call last):
    File "app.py", line 29, in <module>
    flask_whooshalchemyplus.init_app(app)
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/pthon3.4/site-packages/Flask_WhooshAlchemyPlus-0.7.5-py3.4.egg/flask_whooshalchemyplus.py", line 423, in init_app
    whoosh_index_all(app)
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/Flask_WhooshAlchemyPlus-0.7.5-py3.4.egg/flask_whooshalchemyplus.py", line 372, in whoosh_index_all
    'sqlalchemy'].db.Model._decl_class_registry.values()
    KeyError: 'sqlalchemy'

    而且安装的时候提示依赖那个文件必须为 str or list 我把安装依赖的程序删了才装上
    revol
        12
    revol  
       2016-12-04 18:05:35 +08:00
    @boyxy120 要先初始化 sqlalchemy 再来用这个

    依赖文件那个能发一下具体的报错么?
    我每天都会上 github 的,有什么问题给我提 issue 或者发邮件我都会很快回复的~
    zhze93
        13
    zhze93  
       2016-12-22 16:34:13 +08:00
    @revol 您好,使用您的 whooshalchemyplus+ChineseAnalyzer ,无法进行非中文全文搜索
    这是我的配置工厂函数中:
    import flask_whooshalchemyplus
    flask_whooshalchemyplus.init_app(app)
    模型中:
    __searchable__=['body']
    __analyzer__ = ChineseAnalyzer()
    __tablename__='posts'
    能进行英文的正确搜索,以及中文的全文搜索,比如“天气好,开心”,搜索“天气好”能搜到,搜“天气”不行。
    也重置了数据库。( SQLite )
    同您请教,配置哪里需要修改?
    zhze93
        14
    zhze93  
       2016-12-22 16:34:35 +08:00
    @revol 非常感谢~
    wendzhue
        15
    wendzhue  
       2017-02-18 19:53:21 +08:00
    @zhze93 我也遇到这个问题,你解决了吗,能不能告知一下哪出了问题?
    @revol 作者大大知道为什么吗?
    superlead
        16
    superlead  
       2017-04-20 13:37:02 +08:00
    @toono whoosh 大概能支持多大级别的数据量?这方面有了解嘛?谢谢!
    bushiwodeQQ
        17
    bushiwodeQQ  
       2017-05-27 13:35:19 +08:00
    调用 whoosh_search 方法查 Post.query.whoosh_search('mus').all()
    查到的结果:
    E:Python27libsite-packagessqlalchemysqlelements.py:4230: SAWarning: Textual SQL expression 'null' should be explicitly declared as text('null') (this warning may be suppressed after 10 occurrences)
    {"expr": util.ellipses_string(element)})
    []
    我查的字段 searchable = ['title'];
    我数据库 title 里面确实有 mus 这个词的
    @revol 作者大大求指点
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1385 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 16:50 PVG 00:50 LAX 09:50 JFK 12:50
    Do have faith in what you're doing.
    ubao 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