在互联网上的各种网站中,不管大小,基本上都会有一个搜索框,用来给用户对内容进行搜索,小到站点搜索,大到搜索引擎搜索。html
从简单的来讲,搜索功能确实很简单,一个简单的 select
语句就能够实现数据的搜索。python
而从复杂的来看,不管是搜索的精度仍是搜索的效率,都是有很深的研究范围的。git
对于简单的搜索功能来讲,一个 select
查询语句也足够使用,但在稍微复杂一点的搜索环境下,好比网页、文档、新闻资讯等场景,单纯的 select
查询语句则是远远不够。在这些场景下的搜索,全文搜索则是最低配置。github
什么是全文搜索?百度百科如是说:web
全文数据库是全文检索系统的主要构成部分。所谓全文数据库是将一个完整的信息源的所有内容转化为计算机能够识别、处理的信息单元而造成的数据集合。全文数据库不只存储了信息,并且还有对全文数据进行词、字、段落等更深层次的编辑、加工的功能,并且全部全文数据库无一不是海量信息数据库。数据库
是否是看得不明不白的?讲一个简单的例子大概就理解了。正常状况下,咱们搜索“Python 安装教程”,若是是普通的搜索,会直接使用 select 数据库中包含“Python 安装教程”的内容。可是全文搜索,会首先将搜索词拆分红:“Python 安装教程”、“Python”、“安装教程”、“安装”、“教程”等,而后用这些拆分后的词组进行搜索。django
市面上全部的搜索引擎都使用了全文搜索:微信
最近“MrDoc 交流群”里让觅道文档添加上全文搜索的呼声很高,遂打算在觅道文档中把常规的 select 查询搜索替换为全文搜索。app
最多见的开源全文搜索引擎是 Elasticsearch
,功能强大、性能强悍,可是其基于 Java 进行编写,在 Python 中使用不是很方便,最终州的先生选择了纯 Python 实现的全文搜索引擎——whoosh
,并借助 Django 下的开源搜索框架——haystack
,依靠 jieba
中文分词库,在觅道文档这一典型 Python Web 应用中实现了中英文的全文搜索。框架
安装依赖库
如上述所言,本次纯 Python 方案实现中英文全文搜索使用到了以下 3 个库:
whoosh
haystack
jieba
须要对其进行安装,使用 pip 命令进行安装便可:
pip install whoosh
pip install django-haystack
pip install jieba
settings 配置
首先须要在 Django 项目的 settings.py 文件中进行配置。
第1、在 INSTALLED_APPS 中添加 haystack 库:
第2、添加配置 haystack 的配置项
# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
# 自定义高亮
HAYSTACK_CUSTOM_HIGHLIGHTER = "app_doc.search.highlight.MyHighLighter"
建立索引
在 app_doc 目录下新建一个名为 search_indexes.py 的文件,在其中输入以下内容:
在 template 目录下新建一色名为 search 的目录,而后在 search 目录下新建一个名为 indexes 的目录,接着在其中新建一个名为 app_doc 的目录(与 Django 应用同名),最后在这个/template/search/app_doc 目录下新建一个名称 doc_text.txt 的文件(模型名称_text.txt),在其中输入须要索引的模型字段:
{{object.name}}
{{object.pre_content}}
建立中文分词器
因为 whoosh 对中文的分词能力不行,若是咱们搜索中文,其八成不会对其进行分词,因此咱们额外引入了 jieba 模块来进行中文分词。
在 /MrDoc/app_doc/search 目录下新建一个名为 chines_analyzer.py 的文件,在其中写入以下代码:
建立完中文分词器以后,咱们就能够自定义 whoosh 的搜索引擎了。
自定义 whoosh 搜索引擎
在 /MrDoc/app_doc/search
目录下新建一个名为 whoosh_cn_backend.py
的文件(这个路径文件便是咱们在 settings.py 文件中指定的引擎路径),复制 python 安装路径\Lib\site-packages\haystack\backends\whoosh_backend.py
的内容到这个文件中,并作以下修改:
from whoosh.analysis import StemmingAnalyzer
替换为:
from app_doc.search.chinese_analyzer import ChineseAnalyzer as StemmingAnalyzer
这样,咱们自定义可以进行中文分词的 whoosh 引擎就完成了。
编写视图函数
完成上述步骤以后,全文搜索引擎幕后的工做就已经完成了,咱们接下来须要按照 Django 的方式,编写逻辑视图,并进行 HTML 模板的渲染。
在这里,州的先生在/MrDoc/app_doc/下新建了一个名为 views_search.py 的文件来放置全文搜索的视图函数,继承 haystack.views.SearchView
类,自定义了一个全文搜索视图类:
HTML 模板渲染
全文搜索引擎的数据默认返回在了特定的 HTML 模板中,州的先生没有对此进行自定义,因此按照 haystack 的要求,在 template/search
目录下新建了一个名为 search.html
的模板文件,对全文搜索视图类返回的搜索数据集进行渲染解析。
生成索引
最后咱们须要在命令行终端生成一下索引文件,使用以下命令:
python manage.py rebuild_index
这样,就实现了纯 Python 方案的中英文全文搜索,效果以下动图所示:
文中所涉代码均为 MrDoc 觅道文档源码,包括:
/MrDoc/MrDoc/settings.py
/MrDoc/app_doc/search/chinese_analyzer.py
/MrDoc/app_doc/search/highlight.py
/MrDoc/app_doc/search/whoosh_cn_backend.py
/MrDoc/app_doc/search_indexes.py
/MrDoc/app_doc/views_search.py
/MrDoc/template/search/*
源码地址为:
https://gitee.com/zmister/MrDoc
https://github.com/zmister2016/MrDoc
🧐分享、点赞、在看,给个三连击呗!👇
本文分享自微信公众号 - 州的先生(zmister2016)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。