Flask-whooshsqlalchemyplus中文分词搜索问题

我的配置
工厂函数中
def create_app(...):

...
import flask_whooshalchemyplus
flask_whooshalchemyplus.init_app(app)
from app.models import Post
whoosh_index(app,Post)
body=db.Column(db.Text)

我的模型:
class Post(db.Model):

__searchable__=['body']
__analyzer__ = ChineseAnalyzer() 
__tablename__='posts'

我的视图函数:
@ser.route('/search',methods=['POST'])
@login_required
def search():

page=request.args.get("page",1,type=int)
form=g.search_form
if not form.validate_on_submit():
    flash("Empty result.")
    return redirect(url_for('main.index'))
post=Post.query.whoosh_search(form.search.data)
pagination=post.paginate(page,per_page=int(current_app.config['FLASKY_POSTS_PER_PAGE']),error_out=False)
posts=pagination.items
return render_template('/ser/result.html',posts=posts,username=current_user.username,pagination=pagination)

把配置whooshalchemyplus前的POST都删除了,新建的POST英文可以正常搜索,中文只能支持全匹配搜索。
db.session.add(Post(body=u'天气一般般'))
db.session.commit()
a=Post.query.whoosh_search(u'天气').fisrt()
a
[]
a=Post.query.whoosh_search(u'天气一般般').fisrt()
<app.modls........>
该怎么办,新手求助

重置了数据库也无效,数据库用的SQLite

阅读 3.7k
2 个回答

如果用的是 postgresql 数据库的话,检查一下你的数据库的编码是 UTF-8 吗?可以在数据库的 shell 中通过 \l 查看数据库信息:

postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding  |   Collate   |    Ctype    |   Access privileges   
-----------+----------+-----------+-------------+-------------+-----------------------
 db1  | owner | UTF8      | en_US.UTF-8 | en_US.UTF-8 | =Tc/owner         +
           |          |           |             |             | owner=CTc/owner
 db2     | owner   | SQL_ASCII | C           | C           | =Tc/owner           +

数据库 shell 中可以进行中文搜索不?可以通过下面的 sql 检查:

SELECT to_tsvector('我们') @@ to_tsquery('我:*');

上面 db1 是 UTF-8 所以支持中文搜索,

postgres=# \c db1
db1=#
db1=# SELECT to_tsvector('我们') @@ to_tsquery('我:*');
 ?column? 
----------
 t
(1 row)

db1=#

db2 是 SQL_ASCII 不支持中文搜索

db1=# \c db2
db2=#
db2=# SELECT to_tsvector('我们') @@ to_tsquery('我:*');
NOTICE:  text-search query contains only stop words or doesn't contain lexemes, ignored
 ?column? 
----------
 f
(1 row)

db2=#

你可以参考一下这个: https://www.v2ex.com/t/274600...

我之前用的flask-whooshalchemy,中文分词效果也不好, 然后我用结巴jieba做了分词表和索引,然后whooshalchemy搜分词表. 效果还行.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题