版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、如何在Python的Flask框架中实现全文搜索_ 这篇文章主要介绍了在Python的Flask框架中实现全文搜索功能,这个基本的web功能实现起来特别简洁,需要的伴侣可以参考下 全文检索引擎入门 灰常不幸的是,关系型数据库对全文检索的支持没有被标准化。不同的数据库通过它们自己的方式来实现全文检索,而且SQLAlchemy在全文检索上也没有供应一个好的抽象。 我们现在用法SQLite作为我们的数据库,所以我们可以绕开SQLAlchemy而用法SQLite供应的工具来创建一个全文检索索引。但这么做不怎么好,由于假如有一天我们换用别的数据库,那么我们就得重写另一个数据库的全文检索方法。 所以我们的
2、方案是,我们将让我们现有的数据库处理常规数据,然后我们创建一个特地的数据库来解决全文检索。 只有很少的开源的全文检索引擎。据我说知只有一个Whoosh供应了Flask的扩展,它是用Python语言写的全文检索引擎。用法纯Python引擎的优点是它可以运行在任何有Python说明器的地方。缺点就是它的搜干脆能没有达到用C或者C+写的搜索引擎那么好。在我的脑子里抱负的解决方案是有一个搜索引擎,它供应了Flask的扩展,能连接大多数数据库,而且还要像Flask-SQLAlchemy那样供应一个能自由用法大多数数据库的方法,但现在貌似木有这样的全文检索引擎。Django的开发者有一个特别棒的,支持大多
3、数全文检索引擎的扩展,叫django-haystack。盼望有一天某个家伙能为Flask供应一个相像的扩展。 但现在,我们将通过Whoosh实现我们自己的全文检索。我们将用法Flask-WhooshAlchemy扩展,该扩展使得Whoosh数据库和Flask-SQLAlchemy模块结合起来。 假如你还没在你的虚拟环境中安装Flask-WhooshAlchemy扩展,马上安装它。 Windows用户用以下指令安装: 代码如下: flaskScriptspip install Flask-WhooshAlchemy 其他用户用以下指令安装: 代码如下: flask/bin/pip install
4、 Flask-WhooshAlchemy 配置 配置Flask-WhooshAlchemy灰常简洁。我们只需要告诉扩展全文检索数据库的名字即可(fileconfig.py): WHOOSH_BASE = os.path.join(basedir, search.db) 修改模块 在将Flask-WhooshAlchemy和Flask-SQLAlchemy结合起来时,我们需要在合适的模块类(fileapp/models.py)指定哪些数据时需要被索引的: from app import app import flask.ext.whooshalchemy as whooshalchemy cla
5、ss Post(db.Model): _searchable_ = body id = db.Column(db.Integer, primary_key = True) body = db.Column(db.String(140) timestamp = db.Column(db.DateTime) user_id = db.Column(db.Integer, db.ForeignKey(user.id) def _repr_(self): return Post %r % (self.text) whooshalchemy.whoosh_index(app, Post) 这个模块有一个
6、新的_searchable_字段,它是一个列表,包括了全部可以被当做搜索索引的数据库字段。在我们的项目里我们只需要全部文章帖子的body字段。 在这个模块中,我们也必需通过调用whoosh_index这个方法来初始化全文索引。 这不是一个能影响我们关系型数据库的转变,所以我们没必要换新的数据库。 不幸的是全部的博客文章在添加全文检索引擎之前就已经存在于数据库中了,而且没有被索引。为了保持数据库和全文检索引擎的同步,我们将在数据库中删除全部已经存在的博客文章,然后重新开头。首先我们打开Python说明器。Windows用户为以下内容: 代码如下: flaskScriptspython 其它操作系
7、统用户: 代码如下: flask/bin/python 然后在Python指令提示符中删除全部博客文章: from app.models import Post from app import db for post in Post.query.all(): . db.session.delete(post) mit() 搜索 现在我们开头做搜索。首先,让我们添加几篇博客文章到数据库。我们有两种方法做这个事。我们可以像一般用户一样通过网页打开应用程序添加文章,或者挺直在Python指令行里添加。 用一下方法从指令行添加: from app.models import User, Post fr
8、om app import db import datetime u = User.query.get(1) p = Post(body=my first post, timestamp=datetime.datetime.utcnow(), author=u) db.session.add(p) p = Post(body=my second post, timestamp=datetime.datetime.utcnow(), author=u) db.session.add(p) p = Post(body=my third and last post, timestamp=dateti
9、me.datetime.utcnow(), author=u) db.session.add(p) mit() Flask-WhooshAlchemy这个扩展特别不错,由于它能连接Flask-SQLAlchemy然后自动提交。我们不需要维护全文索引,由于它已经很明显的帮我们做了这件事。 现在我们已经在全文索引中有了一些文章,我们可以搜搜看了: Post.query.whoosh_search(post).all() Post umy second post, Post umy first post, Post umy third and last post Post.query.whoosh_
10、search(second).all() Post umy second post Post.query.whoosh_search(second OR last).all() Post umy second post, Post umy third and last post 上面的例子可以看出,查询不需要限制为一个单词。事实上,Whoosh供应了一个美丽又强大的搜索查询语言(search query language)。 整合全文检索到应用程序 为了让我们应用程序的用户能用上搜索功能,我们还需要增加一点小小的转变。 配置 就配置而言,我们仅仅需要指定最大的搜索结果返回数(fileconfi
11、g.py): MAX_SEARCH_RESULTS = 50 搜索表单 我们需要在页面顶部的导航栏中增加一个搜索框。把搜索框放到顶部是极好的,由于这样全部页面就都有搜索框了(注:全部页面公用导航栏)。 首先我们增加一个搜索表单类(fileapp/forms.py): class SearchForm(Form): search = TextField(search, validators = Required() 然后我们需要增加一个搜索表单对象,而且要让它对全部模板可用,这么做是由于我们要将搜索表单放到全部页面的共同的导航栏。完成这个最简洁的方法是在before_request handle
12、r上创建一个form,然后将它传到Flask的全局变量g(fileapp/views.py): app.before_request def before_request(): g.user = current_user if g.user.is_authenticated(): g.user.last_seen = datetime.utcnow() db.session.add(g.user) mit() g.search_form = SearchForm() 然后我们添加form到我们的模板(fileapp/templates/base.html): divMicroblog: a h
13、ref= url_for(index) Home/a % if g.user.is_authenticated() % | a href= url_for(user, nickname = g.user.nickname) Your Profile/a | form style=display: inline; action=url_for(search) method=post name=searchg.search_form.hidden_tag()g.search_form.search(size=20)input type=submit value=Search/form | a hr
14、ef= url_for(logout) Logout/a % endif % /div 留意,我们只是当有用户登录时才会显示这个搜索框。同样的,before_request handler只有在有用户登录时才会创建form,这是由于我们的应用程序不会展现任何内容给没有经过认证的用户。 搜索显示方法(search view funciton) 上面我们已经设置了form的action字段,它会发送全部的搜索恳求到search view方法。这就是我们要执行全文检索查询的地方(fileapp/views.py): app.route(/search, methods = POST) login_r
15、equired def search(): if not g.search_form.validate_on_submit(): return redirect(url_for(index) return redirect(url_for(search_results, query = g.search_form.search.data) 这个方法干的事也不是许多,它只是从表单收集了搜索查询的字段,然后把这些字段作为参数传给查询方法,最终重定向到另一个页面。不在这儿挺直做查询的缘由是假如一个用户点击了刷新按钮,那么扫瞄器就会弹出“表单数据将被重新提交”的警告窗口。所以当一个POST恳求的响应结
16、果为重定向的时候,这种警告提示就被避开了,由于重定向之后扫瞄器的刷新按钮将会在重定向的页面被重新载入。 搜索结果页面 一旦一个查询字段被接受,form POST handler就会通过页面重定向把它发送到search_result handler(fileapp/views.py): app.route(/search_results/query) login_required def search_results(query): results = Post.query.whoosh_search(query, MAX_SEARCH_RESULTS).all() return render_template(search_results.html, query = query, results = results) 然后搜索结果显示方法会发送这个查询到Whoosh,参数是最大的搜索结果数目,由于我们不想呈现一个很大数目的结果页面,所以我们只显示前50条数据。 最终一部分需要完成的是搜索结果的模板(fileapp/templates/search_results.html): !-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 5G通信基站建设
- 交通运输补充协议
- 实验室隔音墙建设协议
- 体育馆建设项目招投标档案
- 电动汽车充电桩招投标文件
- 水上乐园租赁经营合同
- 城市供电项目管理指南
- 律师事务所水电安装施工合同
- 电缆材料厂道路安全管理
- 电影院栏杆装修项目协议
- 西门子RWD68说明书
- 针对建筑工程施工数字化管理分析
- 多品种共线生产质量风险评价
- 【MBA教学案例】从“虾国”到“国虾”:国联水产的战略转型
- Unit-1--College-Life
- 医院车辆加油卡管理制度
- 平面四杆机构急回特性说课课件
- 安徽职业技术学院实验实训室建设管理办法(试行)
- 岗位价值评估表(共4页)
- 娃哈哈晶钻水营销策划方案
- 中南大学湘雅二医院心血管内科重点学科申报书
评论
0/150
提交评论