纯Python方案实现中英文全文搜索
在互联网上的各类网站中,无论大小,基本上都会有一个搜索框,用来给用户对内容进行搜索,小到站点搜索,大到搜索引擎搜索。
从简单的来说,搜索功能确实很简单,一个简单的 select
语句就可以实现数据的搜索。
而从复杂的来看,无论是搜索的精度还是搜索的效率,都是有很深的研究范围的。
对于简单的搜索功能来说,一个 select
查询语句也足够使用,但在稍微复杂一点的搜索环境下,比如网页、文档、新闻资讯等场景,单纯的 select
查询语句则是远远不够。在这些场景下的搜索,全文搜索则是最低配置。
什么是全文搜索?百度百科如是说:
全文数据库是全文检索系统的主要构成部分。所谓全文数据库是将一个完整的信息源的全部内容转化为计算机可以识别、处理的信息单元而形成的数据集合。全文数据库不仅存储了信息,而且还有对全文数据进行词、字、段落等更深层次的编辑、加工的功能,而且所有全文数据库无一不是海量信息数据库。
是不是看得不明不白的?讲一个简单的例子大概就理解了。正常情况下,我们搜索“Python 安装教程”,如果是普通的搜索,会直接使用 select 数据库中包含“Python 安装教程”的内容。但是全文搜索,会首先将搜索词拆分成:“Python 安装教程”、“Python”、“安装教程”、“安装”、“教程”等,然后用这些拆分后的词组进行搜索。
市面上所有的搜索引擎都使用了全文搜索:
最近“MrDoc 交流群”里让觅道文档添加上全文搜索的呼声很高,遂打算在觅道文档中把常规的 select 查询搜索替换为全文搜索。
最常见的开源全文搜索引擎是 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 文件中进行配置。
第一、在 INSTALLED_APPS 中添加 haystack 库:
第二、添加配置 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源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
QUIC Weekly 每周一草(20201125期)
关于QUIC协议的论文、IETF进展、博客、视频等等 QUIC 的全称是 Quick UDP Internet Connections protocol, 由 Google 设计提出,目前由 IETF 工作组推动进展。其设计的目标是替代 TCP 成为 HTTP/3 的数据传输层协议。熹乐科技在物联网(IoT)和边缘计算(Edge Computing)场景也一直在打造底层基于 QUIC 通讯协议的低时延边缘计算框架 YoMo,长时间关注 QUIC 协议的发展,遂整理该文集并配以适当的中文翻译,方便更多关注 QUIC 协议的人学习。 在线社区:🍖discord/quic 维护者:🦖YoMo QUIC Weekly - 20201125期 Wikipedia 上更新了关于 HTTP/3 的章节:HTTP/3 - Wikipedia IETF-QUIC 的标准依赖树 Daniel Stenberg 的新 Keynote HTTP/3 是下一代 HTTP QUIC 在 5G 网络中的实验:QUIC Throughput and Fairness over Dual Connectivity ...
- 下一篇
现在的学生太厉害!冒着挂科的风险写的 Spring Cloud 总结……
点击上方蓝色字关注我们~ 马上要考试了!!! 作为一个苦逼的在读大学生,又要面临半年一度的期末考试了,因为上课没听,我啥都不会,什么通信原理,单片机。。。饶了我吧!!! 给你们看看我上课在干啥你就知道我为啥啥都不会了。 emmm,字比较丑😑。我还记得那是一堂英语课,老师不让用电子设备,我只能手写我这篇文章的思路。。。 所以,冒着期末要挂科的风险👊,我也得把这篇文章写完,给大家分享知识,自己也能重新复习和认识一下Spring Cloud。 首先我给大家看一张图,如果大家对这张图有些地方不太理解的话,我希望你们看完我这篇文章会恍然大悟。 总体架构 什么是Spring cloud 构建分布式系统不需要复杂和容易出错。Spring Cloud 为最常见的分布式系统模式提供了一种简单且易于接受的编程模型,帮助开发人员构建有弹性的、可靠的、协调的应用程序。Spring Cloud 构建于 Spring Boot 之上,使得开发者很容易入手并快速应用于生产中。 官方果然官方,介绍都这么有板有眼的。 我所理解的 Spring Cloud 就是微服务系统架构的一站式解决方案,在平时我们构建微服务的过...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS关闭SELinux安全模块
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Hadoop3单机部署,实现最简伪集群