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

2016-04-26 20:23:12 +08:00
 toono

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

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

7188 次点击
所在节点    Flask
17 条回复
toono
2016-04-26 21:46:46 +08:00
手动顶置~
neo1218
2016-04-26 21:58:40 +08:00
是的, flask-whooshalchemy 内置的分词中文分词不行。建议使用 jieba 分词先创建分词表,然后再用 flask-whooshalchemy 对分词表进行关键字搜索。
toono
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
2016-04-27 13:08:19 +08:00
真心希望有解答,再次手动, sorry
toono
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
2016-05-26 15:32:21 +08:00
还有点比较重要,在配置好全文检索之后加入的记录才回创建搜索索引,也就是配置好之后的新记录才能被搜索。
revol
2016-06-18 23:57:12 +08:00
@toono 为啥不能正常用呢~
toono
2016-06-19 00:16:53 +08:00
@revol whoosh 不支持 py3 , flask-whooshalchemy 内置的中文分词有问题。
revol
2016-06-29 00:09:15 +08:00
@toono 我更新了个版本,修复了一些 bug 你可以再试试看
toono
2016-07-05 10:38:07 +08:00
@revol wow!原来是你作者~
之前没发现哈哈哈😂
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
2016-12-04 18:05:35 +08:00
@boyxy120 要先初始化 sqlalchemy 再来用这个

依赖文件那个能发一下具体的报错么?
我每天都会上 github 的,有什么问题给我提 issue 或者发邮件我都会很快回复的~
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
2016-12-22 16:34:35 +08:00
@revol 非常感谢~
wendzhue
2017-02-18 19:53:21 +08:00
@zhze93 我也遇到这个问题,你解决了吗,能不能告知一下哪出了问题?
@revol 作者大大知道为什么吗?
superlead
2017-04-20 13:37:02 +08:00
@toono whoosh 大概能支持多大级别的数据量?这方面有了解嘛?谢谢!
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 作者大大求指点

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

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

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

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

© 2021 V2EX