当前位置:网站首页>使用 flask_whooshalchemyplus jieba实现flask的全局搜索

使用 flask_whooshalchemyplus jieba实现flask的全局搜索

2022-07-06 09:24:00 小白阿远

前言

因为flask_SqlAlchemy尚未支持全文搜索,所以使用flask_whooshalchemyplus来实现

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。

Whoosh是一个用来索引文本并能根据索引搜索的的包含类和方法的类库。


安装 flask_whooshalchemyplus jieba

pip install flask_whooshalchemyplus
版本为0.7.6

若直接pip安装不成功的时候可以采取以下方法

git clone https://github.com/Revolution1/Flask-WhooshAlchemyPlus.git

先将Flask-WhooshAlchemyPlus克隆到本地项目中然后 

cd Flask-WhooshAlchemyPlus进入到克隆到本地的问价夹中再进行

pip install flask_whooshalchemyplus

pip install SQLAlchemy==1.3.24

需要注意SQLAlchemy版本,1.4会出现问题

jieba

jieba是优秀的第三方中文词库,可以避免因为中文编码出现的问题

pip install jieba

全文搜索相当于给项目加上了全文索引

所以flask项目配置文件中应该加上全文索引的位置

项目配置文件config.py

import os
basedir = os.path.abspath(os.path.dirname(__file__))
# 索引存放位置
WHOOSH_BASE = os.path.join(basedir, 'WHOOSH_BASE_INDEX')

init.py工厂函数中的初始化 

import flask_whooshalchemyplus

#create_app() 函数就是程序的工厂函数,接受一个参数,是程序使用的配置名
def create_app(config_name):
    app = Flask(__name__)
    #程序创建并配置好后,就能初始化扩展了。在之前创建的扩展对象上调用 init_app() 可以完成初始化    过程。
    db.init_app(app)
    with app.app_context():
        flask_whooshalchemyplus.index_all(app)
    #工厂函数返回创建的程序示例
    return app

 模型类的变化

在模型类里便写明需要作为全文索引的字段,以及将默认的分词器改为jieba中的中文分词器

加入中文搜索支持

__analyzer__ = ChineseAnalyzer()

例如将表中的desc及title作为全文索引

from jieba.analyse.analyzer import ChineseAnalyzer
# 指明作为全文索引的字段
__searchable__ = ['title', 'desc']
# 将默认的分词器改为jieba的中文分词器
__analyzer__ = ChineseAnalyzer()

在视图中实现效果

如果数据库里增加了新的数据的话,切记一定要使用如下代码更新索引


        db.session.add(course)
        db.session.commit()
        flask_whooshalchemyplus.index_one_model(Course)

写一个接口来实现全文索引的使用

class SearchCourse(Resource):
    """
    获取包含搜索内容的全部信息
    """
    def get(self):
        parser = reqparse.RequestParser()
        # 获取前端传过来的数据
        parser.add_argument('q')
        args = parser.parse_args()
        q = args.get('q')
        # 使用whoosh_search(), 将前端传过来的数据作为搜索的关键字进行搜索
        course_list = Course.query.whoosh_search(q).all()
        # 将得到的数据返回出去
        return marshal(course_list, course_fields)

到这里基本上就可以实现全文索引并且可以使用中文实现全文搜索

原网站

版权声明
本文为[小白阿远]所创,转载请带上原文链接,感谢
https://blog.csdn.net/m0_61653001/article/details/124672101