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使用rsa加密算法模块模拟新浪微博登录
Jan 22 Python
Python中的exec、eval使用实例
Sep 23 Python
Python CSV模块使用实例
Apr 09 Python
Python使用django搭建web开发环境
Jun 09 Python
python urllib urlopen()对象方法/代理的补充说明
Jun 29 Python
Django 多环境配置详解
May 14 Python
python flask解析json数据不完整的解决方法
May 26 Python
使用python来调用CAN通讯的DLL实现方法
Jul 03 Python
Python 中list ,set,dict的大规模查找效率对比详解
Oct 11 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
Mar 17 Python
浅谈Python中threading join和setDaemon用法及区别说明
May 02 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
Jun 03 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实现rc4加密算法代码
2012/04/25 PHP
MongoDB在PHP中的常用操作小结
2014/02/20 PHP
教你如何开启shopnc b2b2c 伪静态
2014/10/21 PHP
PHP实现通过Luhn算法校验信用卡卡号是否有效
2015/03/23 PHP
基于Laravel 多个中间件的执行顺序详解
2019/10/21 PHP
JS加ASP二级域名转向的代码
2007/05/17 Javascript
js 页面执行时间计算代码
2009/03/04 Javascript
纯js实现背景图片切换效果代码
2010/11/14 Javascript
JavaScript对IE操作的经典代码(推荐)
2014/03/10 Javascript
javascript中通过arguments参数伪装方法重载
2014/10/08 Javascript
jQuery中each()方法用法实例
2014/12/27 Javascript
基于bootstrap的选择框插件icheck
2016/12/23 Javascript
javascript显示系统当前时间代码
2016/12/29 Javascript
Vue页面骨架屏的实现方法
2018/05/22 Javascript
laypage.js分页插件使用方法详解
2019/07/27 Javascript
[01:19:34]2014 DOTA2国际邀请赛中国区预选赛 New Element VS Dream time
2014/05/22 DOTA
python中常用的各种数据库操作模块和连接实例
2014/05/29 Python
python3实现短网址和数字相互转换的方法
2015/04/28 Python
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
在Pycharm中自动添加时间日期作者等信息的方法
2019/01/16 Python
Django框架搭建的简易图书信息网站案例
2019/05/25 Python
python SVM 线性分类模型的实现
2019/07/19 Python
python同义词替换的实现(jieba分词)
2020/01/21 Python
使用TensorFlow直接获取处理MNIST数据方式
2020/02/10 Python
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
四年级科学教学反思
2014/02/10 职场文书
小学生学习雷锋倡议书
2014/05/15 职场文书
广播体操比赛口号
2014/06/10 职场文书
白莲教口号
2014/06/18 职场文书
项目转让协议书
2014/10/27 职场文书
2014年档案管理工作总结
2014/11/17 职场文书
公司行政助理岗位职责
2015/04/11 职场文书
2015年度团总支工作总结
2015/04/23 职场文书
解决SpringBoot文件上传临时目录找不到的问题
2021/07/01 Java/Android
MyBatis 动态SQL全面详解
2021/10/05 MySQL
详解SQL报错盲注
2022/07/23 SQL Server