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程序中实现分布式进程的教程
Apr 28 Python
Python文件操作,open读写文件,追加文本内容实例
Dec 14 Python
Python 实现随机数详解及实例代码
Apr 15 Python
Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)
Apr 18 Python
PyCharm代码提示忽略大小写设置方法
Oct 28 Python
python读写配置文件操作示例
Jul 03 Python
python实现超市管理系统(后台管理)
Oct 25 Python
Python 矩阵转置的几种方法小结
Dec 02 Python
windows下Pycharm安装opencv的多种方法
Mar 05 Python
Python用K-means聚类算法进行客户分群的实现
Aug 23 Python
python语音识别指南终极版(有这一篇足矣)
Sep 09 Python
Pytorch 中net.train 和 net.eval的使用说明
May 22 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微信公众平台配置接口开发程序
2016/09/22 PHP
php实现的mysqldb读写分离操作类示例
2017/02/07 PHP
Yii框架连表查询操作示例
2019/09/06 PHP
js parentElement和offsetParent之间的区别
2010/03/23 Javascript
JavaScript flash复制库类 Zero Clipboard
2011/01/17 Javascript
25个优雅的jQuery Tooltip插件推荐
2011/05/25 Javascript
JS简单实现登陆验证附效果图
2013/11/19 Javascript
同域jQuery(跨)iframe操作DOM(示例代码)
2013/12/13 Javascript
Blocksit插件实现瀑布流数据无限( 异步)加载
2014/06/20 Javascript
jQuery中index()的用法分析
2014/09/05 Javascript
分享两段简单的JS代码防止SQL注入
2016/04/12 Javascript
DOM 事件的深入浅出(一)
2016/12/05 Javascript
EasyUI修改DateBox和DateTimeBox的默认日期格式示例
2017/01/18 Javascript
详解nodejs中exports和module.exports的区别
2017/02/17 NodeJs
bootstrap multiselect下拉列表功能
2017/08/22 Javascript
AngularJS 表单验证手机号的实例(非必填)
2017/11/12 Javascript
Angular 5.0 来了! 有这些大变化
2017/11/15 Javascript
JavaScript遍历数组的三种方法map、forEach与filter实例详解
2019/02/27 Javascript
Python fileinput模块使用介绍
2014/11/30 Python
python操作ie登陆土豆网的方法
2015/05/09 Python
Python 基础教程之包和类的用法
2017/02/23 Python
python读取视频流提取视频帧的两种方法
2020/10/22 Python
python 提取文件指定列的方法示例
2019/08/07 Python
对django2.0 关联表的必填on_delete参数的含义解析
2019/08/09 Python
python 爬虫百度地图的信息界面的实现方法
2019/10/27 Python
python简单实现最大似然估计&scipy库的使用详解
2020/04/15 Python
详解Python中openpyxl模块基本用法
2021/02/23 Python
大学团支书的自我评价分享
2013/12/14 职场文书
电气工程和自动化自荐信范文
2013/12/25 职场文书
咖啡厅创业计划书范本
2014/01/22 职场文书
文秘档案管理岗位职责
2014/03/06 职场文书
劳保用品管理制度范本
2015/08/06 职场文书
跟班学习心得体会(共6篇)
2016/01/23 职场文书
Python竟然能剪辑视频
2021/05/25 Python
一文搞懂Golang 时间和日期相关函数
2021/12/06 Golang
25张裸眼3D图片,带你重温童年的记忆,感受3D的魅力
2022/02/06 杂记