V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
toono
V2EX  ›  Flask

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

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

    因为需要用到全文搜索,所以用了 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/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'

    而且安装的时候提示依赖那个文件必须为 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   ·   实用小工具   ·   1014 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:50 · PVG 05:50 · LAX 13:50 · JFK 16:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.