Python实现中英文全文搜索的示例


Posted in Python onDecember 04, 2020

文章版权所有:州的先生博客

原文地址:https://zmister.com/archives/1596.html

在互联网上的各类网站中,无论大小,基本上都会有一个搜索框,用来给用户对内容进行搜索,小到站点搜索,大到搜索引擎搜索。

从简单的来说,搜索功能确实很简单,一个简单的 select 语句就可以实现数据的搜索。

而从复杂的来看,无论是搜索的精度还是搜索的效率,都是有很深的研究范围的。

对于简单的搜索功能来说,一个 select 查询语句也足够使用,但在稍微复杂一点的搜索环境下,比如网页、文档、新闻资讯等场景,单纯的 select 查询语句则是远远不够。在这些场景下的搜索,全文搜索则是最低配置。

什么是全文搜索?百度百科如是说:

全文数据库是全文检索系统的主要构成部分。所谓全文数据库是将一个完整的信息源的全部内容转化为计算机可以识别、处理的信息单元而形成的数据集合。全文数据库不仅存储了信息,而且还有对全文数据进行词、字、段落等更深层次的编辑、加工的功能,而且所有全文数据库无一不是海量信息数据库。

是不是看得不明不白的?讲一个简单的例子大概就理解了。正常情况下,我们搜索“Python 安装教程”,如果是普通的搜索,会直接使用 select 数据库中包含“Python 安装教程”的内容。但是全文搜索,会首先将搜索词拆分成:“Python 安装教程”、“Python”、“安装教程”、“安装”、“教程”等,然后用这些拆分后的词组进行搜索。

市面上所有的搜索引擎都使用了全文搜索:

Python实现中英文全文搜索的示例

最近“MrDoc 交流群”里让觅道文档添加上全文搜索的呼声很高,遂打算在觅道文档中把常规的 select 查询搜索替换为全文搜索。

最常见的开源全文搜索引擎是 Elasticsearch,功能强大、性能强悍,但是其基于 Java 进行编写,在 Python 中使用不是很方便,最终州的先生选择了纯 Python 实现的全文搜索引擎——whoosh,并借助 Django 下的开源搜索框架——haystack,依靠 jieba 中文分词库,在觅道文档这一典型 Python Web 应用中实现了中英文的全文搜索。

Python实现中英文全文搜索的示例

安装依赖库

如上述所言,本次纯 Python 方案实现中英文全文搜索使用到了如下 3 个库:

  • whoosh
  • haystack
  • jieba

需要对其进行安装,使用 pip 命令进行安装即可:

pip install whoosh
pip install django-haystack
pip install jieba

settings 配置

首先需要在 Django 项目的 settings.py 文件中进行配置。

第一、在 INSTALLED_APPS 中添加 haystack 库:

Python实现中英文全文搜索的示例

第二、添加配置 haystack 的配置项

Python实现中英文全文搜索的示例

# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
# 自定义高亮
HAYSTACK_CUSTOM_HIGHLIGHTER = "app_doc.search.highlight.MyHighLighter"

创建索引

在 app_doc 目录下新建一个名为 search_indexes.py 的文件,在其中输入如下内容:

Python实现中英文全文搜索的示例

在 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 的文件,在其中写入如下代码:

Python实现中英文全文搜索的示例

自定义 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 类,自定义了一个全文搜索视图类:

Python实现中英文全文搜索的示例

HTML 模板渲染

全文搜索引擎的数据默认返回在了特定的 HTML 模板中,州的先生没有对此进行自定义,所以按照 haystack 的要求,在 template/search 目录下新建了一个名为 search.html 的模板文件,对全文搜索视图类返回的搜索数据集进行渲染解析。

Python实现中英文全文搜索的示例

生成索引

最后我们需要在命令行终端生成一下索引文件,使用如下命令:

python manage.py rebuild_index

这样,就实现了纯 Python 方案的中英文全文搜索,效果如下动图所示:

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

以上就是Python实现中英文全文搜索的示例的详细内容,更多关于python 实现全文搜索的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python网络爬虫项目:内容提取器的定义
Oct 25 Python
Python 正则表达式入门(中级篇)
Dec 07 Python
pandas 将list切分后存入DataFrame中的实例
Jul 03 Python
Python实现的简单排列组合算法示例
Jul 04 Python
Numpy中的mask的使用
Jul 21 Python
python tkinter实现彩球碰撞屏保
Jul 30 Python
使用python远程操作linux过程解析
Dec 04 Python
Django-rest-framework中过滤器的定制实例
Apr 01 Python
django中related_name的用法说明
May 20 Python
Keras中的两种模型:Sequential和Model用法
Jun 27 Python
python调用有道智云API实现文件批量翻译
Oct 10 Python
手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年
Nov 25 Python
一文带你了解Python 四种常见基础爬虫方法介绍
Dec 04 #Python
使用Python通过oBIX协议访问Niagara数据的示例
Dec 04 #Python
python飞机大战游戏实例讲解
Dec 04 #Python
python 根据列表批量下载网易云音乐的免费音乐
Dec 03 #Python
python中字符串的编码与解码详析
Dec 03 #Python
python 爬取百度文库并下载(免费文章限定)
Dec 04 #Python
filter使用python3代码进行迭代元素的实例详解
Dec 03 #Python
You might like
简单谈谈PHP vs Node.js
2015/07/17 PHP
PHP简单的MVC框架实现方法
2015/12/01 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
2019/04/27 PHP
Javascript中string转date示例代码
2013/11/01 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
2013/11/03 Javascript
原生js事件的添加和删除的封装
2014/07/01 Javascript
jQuery链使用指南
2015/01/20 Javascript
浅谈Jquery为元素绑定事件
2015/04/27 Javascript
js实现二级菜单渐隐显示
2015/11/03 Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
2016/06/08 Javascript
JS实现兼容各种浏览器的高级拖动方法完整实例【测试可用】
2016/06/21 Javascript
Jquery组件easyUi实现选项卡切换示例
2016/08/23 Javascript
Vue.js每天必学之过渡与动画
2016/09/06 Javascript
基于js实现的限制文本框只可以输入数字
2016/12/05 Javascript
JS 循环li添加点击事件 (闭包的应用)
2016/12/10 Javascript
node.js利用mongoose获取mongodb数据的格式化问题详解
2017/10/06 Javascript
基于webpack4搭建的react项目框架的方法
2018/06/30 Javascript
基于vue展开收起动画的示例代码
2018/07/05 Javascript
微信小程序登录数据解密及状态维持实例详解
2019/05/06 Javascript
解决mui框架中switch开关通过js控制开或者关状态时小圆点不动的问题
2019/09/03 Javascript
Python实现删除当前目录下除当前脚本以外的文件和文件夹实例
2015/07/27 Python
Pycharm+Scrapy安装并且初始化项目的方法
2019/01/15 Python
python读取图片任意范围区域
2019/01/23 Python
python判断文件夹内是否存在指定后缀文件的实例
2019/06/10 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
jupyter notebook更换皮肤主题的实现
2021/01/07 Python
香港最新科技与优质家居产品购物网站:J SELECT
2018/08/21 全球购物
医学院校毕业生自荐信范文
2014/01/01 职场文书
大学毕业自我评价
2014/02/02 职场文书
军训鉴定表自我鉴定
2014/02/13 职场文书
亲属关系公证书
2014/04/08 职场文书
村安全生产责任书
2014/08/25 职场文书
用人单位终止解除劳动合同证明书
2014/10/06 职场文书
怎样写离婚协议书
2015/01/26 职场文书
Angular CLI发布路径的配置项浅析
2021/03/29 Javascript
Java Spring Boot 正确读取配置文件中的属性的值
2022/04/20 Java/Android