英文博客地址:blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-x-full-text-search

中文翻译地址:http://www.pythondoc.com/flask-mega-tutorial/textsearch.html

开源中国社区:http://www.oschina.net/translate/the-flask-mega-tutorial-part-x-full-text-search

备注:之前的英文博客我不翻墙也是能进去的,今天不翻墙就根本看不到英文博客,简直心累。

这部分内容是关于搜索的。

很多网站会直接使用google,bing来进行搜索,这些对于大部分是静态网页的网站,例如论坛来说是很方便的。但是我们这个微博应用程序,是由那些不长的博文组成的,是动态的。例如我们想搜索含有“dog”的微博,除非有用户搜索,否则大型搜索引擎是不会返回搜索结果的索引。(我的理解就是除非有人搜索这个词出来了这个词的搜索结果的页面,否则大型搜索引擎是不会返回搜索结果页面的。)

一、全文搜索引擎的简介

不幸的是,在关系数据库中的全文搜索支持没有很好的规范。每个数据库都以自己的方式实现全文搜索,并且 SQLAlchemy 没有实现全文搜索。

我们让数据库处理常规数据,我们将创建一个专门的数据库,专注服务于文本搜索。

教程:现在有一些开源的全文搜索引擎。在我的知识范围内唯一一个用 Python 编写的 Flask 扩展是 Whoosh。 一个纯 Python 的搜索引擎的好处就是在 Python 解释器可用的任何地方能够安装和运行。缺点也是很显然的,性能可能比不上 C 或者 C++ 编写的。我的观点是最理想的解决方式就是开发一个连接不同搜索引擎的 Flask 扩展,以某种方式来处理搜索,就像 Flask-SQLAlchemy 一样。但是目前在 Flask 中暂时没有这类型的扩展。Django 开发者提供了一个很好的扩展,用来支持不同的全文搜索引擎,叫做 django-haystack。也许不久就会有人写一个类似的 Flask 扩展。

flask/bin/pip install Flask-WhooshAlchemy

aaarticlea/png;base64,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" alt="" />

于是我直接aaarticlea/png;base64,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" alt="" />这样了

二、配置

配置 Flask-WhooshAlchemy 也是相当简单。我们只需要告诉扩展全文搜索数据库的名称(文件 config.py):

WHOOSH_BASE = os.path.join(basedir, 'search.db')

三、模型修改

因为把 Flask-WhooshAlchemy 整合进 Flask-SQLAlchemy,我们需要在模型的类中指明哪些数据需要建立搜索索引(文件 app/models.py):

from app import app

import sys
if sys.version_info >= (3, 0):
enable_search = False
else:
enable_search = True
import flask.ext.whooshalchemy as whooshalchemy class 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.body) if enable_search:
whooshalchemy.whoosh_index(app, Post)

备注:python3使用这个扩展是有点问题的,上面代码是英文博客中进行了以下修正之后的。

这个模块有一个新的__searchable__字段,它是一个列表,包括了所有可以被当做搜索索引的数据库字段。在我们的项目里我们只需要所有文章帖子的body字段。

在这个模块中,我们也必须通过调用whoosh_index这个方法来初始化全文索引。

这不是一个能影响我们关系型数据库的改变,所以我们没必要换新的数据库。

因为之前存储在数据库的 blog 是没有建立索引的。为了保持数据库和全文搜索引擎的同步,我们需要删除之前撰写的 blog:

flask/bin/python

>>> from app.models import Post
>>> from app import db
>>> for post in Post.query.all():
... db.session.delete(post)
>>> db.session.commit()

四、全文搜索

在搜索之前,我们需要在数据库中添加一些blog,可以在网站上添加,也可以直接使用python命令行。

>>> from app.models import User, Post
>>> from 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=datetime.datetime.utcnow(), author=u)
>>> db.session.add(p)
>>> db.session.commit()

Flask-WhooshAlchemy这个扩展能连接Flask-SQLAlchemy然后自动提交。我们不需要维护全文索引,因为它已经帮我们做了这件事。

现在我们在全文索引中有一些 blog,我们可以这样搜索:

>>> Post.query.whoosh_search('post').all()
[<Post u'my second post'>, <Post u'my first post'>, <Post u'my third and last post'>]
>>> Post.query.whoosh_search('second').all()
[<Post u'my second post'>]
>>> Post.query.whoosh_search('second OR last').all()
[<Post u'my second post'>, <Post u'my third and last post'>]

在上面例子中可以看到,查询并不限制于单个词。实际上,Whoosh 支持一个更加强大的 搜索查询语言

五、整合全文搜索到应用程序

1. 配置

在配置文件中,我们需要指明搜索结果返回的最大数量(文件 config.py):

MAX_SEARCH_RESULTS = 50

2.搜索表单

在导航栏中添加一个搜索表单,这样网站所有页面都有搜索功能。

首先,我们添加一个搜索表单类(文件 app/forms.py):

class SearchForm(Form):
search = StringField('search', validators=[DataRequired()])

接着我们必须创建一个搜索表单对象并且使得它对所有模版中可用,因为我们将搜索表单放在导航栏中,导航栏是所有页面共有的。最容易的方式就是在 before_request 函数中创建这个表单对象,接着把它放在全局变量 g 中(文件 app/views.py):

from forms import SearchForm

@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)
db.session.commit()
g.search_form = SearchForm()

接着添加表单到模板中(文件 app/templates/base.html):

<div>Microblog:
<a href="{{ 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="search">{{ g.search_form.hidden_tag() }}{{ g.search_form.search(size=20) }}<input type="submit" value="Search"></form>
| <a href="{{ url_for('logout') }}">Logout</a>
{% endif %}
</div>

注意,只有当用户登录后,我们才会显示搜索表单。before_request 函数仅仅当用户登录才会创建一个表单对象,因为我们的程序不会对非认证用户显示任何内容。

3.搜索视图函数

上面的模版中,我们在 action 字段中设置发送搜索请求到 search 视图函数。search 视图函数如下(文件 app/views.py):

@app.route('/search', methods=['POST'])
@login_required
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))

它只是从查询表单这能够获取查询的内容,并把它作为参数重定向另外一页。搜索工作不在这里直接做的原因还是担心用户无意中触发了刷新,这样会导致表单数据被重复提交。

4.搜索结果页

一旦一个查询字段被接受,form POST handler就会通过页面重定向把它发送到search_result。(文件 app/views.py):

from config import MAX_SEARCH_RESULTS

@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条数据。

最后一部分就是搜索结果的模版(文件 app/templates/search_results.html):

<!-- extend base layout -->
{% extends "base.html" %} {% block content %}
<h1>Search results for "{{query}}":</h1>
{% for post in results %}
{% include 'post.html' %}
{% endfor %}
{% endblock %}

效果:

aaarticlea/png;base64,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" alt="" />

Flask学习之十 全文搜索的更多相关文章

  1. SQL反模式学习笔记17 全文搜索

    目标:全文搜索 使用SQL搜索关键字,同时保证快速和精确,依旧是相当地困难. SQL的一个基本原理(以及SQL所继承的关系原理)就是一列中的单个数据是原子性的. 反模式:模式匹配 使用Like 或者正 ...

  2. ElasticSearch7.3学习(二十六)----搜索(Search)参数总结、结果跳跃(bouncing results)问题解析

    1.preference 首先引入一个bouncing results问题,两个document排序,field值相同:不同的shard上,可能排序不同:每次请求轮询打到不同的replica shar ...

  3. Flask学习之十二 使用boostrap

    英文博客地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xii-facelift 中文翻译地址:http://w ...

  4. Flask 教程 第十六章:全文搜索

    本文翻译自The Flask Mega-Tutorial Part XVI: Full-Text Search 这是Flask Mega-Tutorial系列的第十六部分,我将在其中为Microblo ...

  5. 精选SpringBoot八大开源项目:支付、秒杀、全文搜索等

    前言 曾在自己的博客中写下这样一段话:有一种力量无人能抵挡,它永不言败生来倔强.有一种理想照亮了迷茫,在那写满荣耀的地方. 如今,虽然没有大理想抱负,但是却有自己的小计划.下面是这一年来,自己利用闲暇 ...

  6. coreseek实战(三):全文搜索在php中应用(使用api接口)

    coreseek实战(三):全文搜索在php中应用(使用api接口) 这一篇文章开始学习在php页面中通过api接口,使用coreseek全文搜索. 第一步:综合一下前两篇文章,coreseek实战( ...

  7. paip.mysql fulltext 全文搜索.最佳实践.

    paip.mysql fulltext 全文搜索.最佳实践.  作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blo ...

  8. MySQL+Sphinx实现全文搜索

    最近在做一个搜索引擎,主要是对图书方面的对象级的搜索,首先来了解下Sphinx吧. 它能够提高你的查询的速度,这个不是一般的快. Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,Pos ...

  9. 记一次企业级爬虫系统升级改造(五):基于JieBaNet+Lucene.Net实现全文搜索

    实现效果: 上一篇文章有附全文搜索结果的设计图,下面截一张开发完成上线后的实图: 基本风格是模仿的百度搜索结果,绿色的分页略显小清新. 目前已采集并创建索引的文章约3W多篇,索引文件不算太大,查询速度 ...

随机推荐

  1. 解决Cesium1.50对gltf2.0/3dtiles数据读取的问题

    问题说明 Cesium 1.50(2018/10/01)版本打开3dtiles可能会出现加载不上导致渲染停止的错误. 错误说明为:RuntimeError: Unsupported glTF Exte ...

  2. netbeans 代码自动补全设置

    编辑器-----代码完成------语言选择"JAVA"------在如图红框中输入 @ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrst ...

  3. 访问者模式(Visitor、Element、accept、ObjectStructure、)(操作外置,与数据结构分离)

    访问者模式表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作.从定义可以看出结构对象是使用访问者模式的必备条件,而且这个结构对象必须存在遍历自身各个 ...

  4. OpenLayers使用弹出窗口

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...

  5. C# 通过URL得到图片的问题

    第一个方法在读取某些图片会报错 public static Image get_Fill_image(string url) { var image = new Image(); image.Sour ...

  6. mybatis-plus思维导图,让mybatis-plus不再难懂

    mybatis-plus与mybatis mybatis Mybatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置 ...

  7. Liferay 7 OSGi第三方jar包依赖问题

    发现遇到这个问题的人挺多的,现在跟新一下好好写. 在开发Liferay的时候,我们常常会遇到Unresolved requirement: Import-Package: {package name} ...

  8. Future Maker | 领跑亚太 进击的阿里云数据库

    7月31日,阿里云马来西亚峰会在吉隆坡召开,阿里巴巴集团副总裁.阿里云智能数据库事业部总裁李飞飞在演讲中表示:“作为亚太地区第一的云服务提供商,阿里云数据库已为多家马来西亚知名企业提供技术支持,助力企 ...

  9. linuxtoy.org资源

    https://linuxtoy.org/archives.html Archives 在 Android 系统上安装 Debian Linux 与 R (2015-07-14) Pinos:实现摄像 ...

  10. 跨境网上收款 找PayPal没错(php如何实现paypal支付)

    开发前准备 在我的博客中 有介绍如何获取ID 和 secret : 好了 在上一篇博客中详细介绍了也不少: 跨境网上收款 找PayPal没错(如何获取ID 和 secret) http://blog. ...