引言
目前我了解到的在flask应用中全文搜索方案有3种。第一种是用sql语句做全文搜索,第二种是用flask_whooshalchemy方案,剩下的一种是使用flask_elasticsearch方案。
直接使用sql语句
使用sql中like的方法:
all_results = Post.query.filter(Post.body.like(string) .all()
这种方法在查询速度和批量更新的速度上都比较平庸。还不错。
使用flask_whooshalchemy
flask_whooshalchemy 是结合了whoosh和sqlalchmey的搜索引擎。它会对你要检索的字段都建立索引。使用起来也很方便,给WHOOSH_BASE的路径,用来存放索引。 在定义的model里添加searchable字段,哪些字段需要被建立索引。
__searchable__ = ['title', 'content'] # these fields will be indexed by whoosh
使用flask_whooshalchemy搜索速度很快,但在更新数据更新索引时很慢。
在查看flask_whooshalchemy资料时,还找到了flask_whooshalchemyplus插件。https://pypi.python.org/pypi/Flask-WhooshAlchemyPlus/0.7.2
使用flask_elasticsearch方案
是基于Elasticsearch对flask的扩展。Elasticsearch是是一个基于Apache Lucene(TM)的开源搜索引擎。它是分布式的,RESTful搜索引擎。我们只需使用RESTful api 就能简单的进行全文检索等。数据是以json格式传输的。事实上它就是面向文档对象的:存储文档,并以json的格式文档序列化。对每个文档提供索引。
关系型数据库和Elasticsearch类比:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields
使用:
安装elasticsearch,然后将数据存储。在 flask应用中使用flask_elasticsearch,配置ELASTICSEARCH_HOST,指向该引擎。举个删除数据的例子:
es.delete(index='pair', doc_type='e2z', id=check_pair)
这个方案在查询速度和数据更新速度上都是快的。而且Elasticsearch还可以进行分布集群。使性能更好