引言
目前我了解到的在flask應(yīng)用中全文搜索方案有3種弄慰。第一種是用sql語句做全文搜索,第二種是用flask_whooshalchemy方案丁恭,剩下的一種是使用flask_elasticsearch方案曹动。
直接使用sql語句
使用sql中l(wèi)ike的方法:
all_results = Post.query.filter(Post.body.like(string) .all()
這種方法在查詢速度和批量更新的速度上都比較平庸斋日。還不錯牲览。
使用flask_whooshalchemy
flask_whooshalchemy 是結(jié)合了whoosh和sqlalchmey的搜索引擎。它會對你要檢索的字段都建立索引。使用起來也很方便第献,給WHOOSH_BASE的路徑贡必,用來存放索引。 在定義的model里添加searchable字段庸毫,哪些字段需要被建立索引仔拟。
__searchable__ = ['title', 'content']? # these fields will be indexed by whoosh
使用flask_whooshalchemy搜索速度很快,但在更新數(shù)據(jù)更新索引時很慢飒赃。
在查看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 就能簡單的進行全文檢索等挠乳。數(shù)據(jù)是以json格式傳輸?shù)摹J聦嵣纤褪敲嫦蛭臋n對象的:存儲文檔姑躲,并以json的格式文檔序列化睡扬。對每個文檔提供索引。
關(guān)系型數(shù)據(jù)庫和Elasticsearch類比:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices? -> Types? -> Documents -> Fields
使用:
安裝elasticsearch黍析,然后將數(shù)據(jù)存儲卖怜。在 flask應(yīng)用中使用flask_elasticsearch,配置ELASTICSEARCH_HOST橄仍,指向該引擎韧涨。舉個刪除數(shù)據(jù)的例子:
es.delete(index='pair', doc_type='e2z', id=check_pair)
這個方案在查詢速度和數(shù)據(jù)更新速度上都是快的。而且Elasticsearch還可以進行分布集群侮繁。使性能更好