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 相关文章推荐
PyQt实现界面翻转切换效果
Apr 20 Python
Python OpenCV处理图像之图像像素点操作
Jul 10 Python
Flask Web开发入门之文件上传(八)
Aug 17 Python
Python实现按逗号分隔列表的方法
Oct 23 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
Jan 17 Python
Pandas+Matplotlib 箱式图异常值分析示例
Dec 09 Python
python的sys.path模块路径添加方式
Mar 09 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
Apr 22 Python
PyTorch-GPU加速实例
Jun 23 Python
使用npy转image图像并保存的实例
Jul 01 Python
Python使用tkinter实现摇骰子小游戏功能的代码
Jul 02 Python
Python基础之元编程知识总结
May 23 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版自动生成文章摘要
2008/07/23 PHP
学习php笔记 字符串处理
2010/10/19 PHP
延长phpmyadmin登录时间的方法
2011/02/06 PHP
PHP将DateTime对象转化为友好时间显示的实现代码
2011/09/20 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
2015/01/07 PHP
PHP制作用户注册系统
2015/10/23 PHP
Yii2下session跨域名共存的解决方案
2017/02/04 PHP
thinkPHP5.0框架自动加载机制分析
2017/03/18 PHP
php中类和对象:静态属性、静态方法
2017/04/09 PHP
浅谈关于PHP解决图片无损压缩的问题
2017/09/01 PHP
phpStudy 2016 使用教程详解(支持PHP7)
2017/10/18 PHP
返回页面顶部top按钮通过锚点实现(自写)
2013/08/30 Javascript
css结合js制作下拉菜单示例代码
2014/02/27 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
2014/12/17 Javascript
jQuery实现拖拽效果插件的方法
2015/03/23 Javascript
ECMAScript中函数function类型
2015/06/03 Javascript
jquery实现清新实用的网页菜单效果
2015/08/28 Javascript
深入理解JavaScript中为什么string可以拥有方法
2016/05/24 Javascript
使用requirejs模块化开发多页面一个入口js的使用方式
2017/06/14 Javascript
ionic2懒加载配置详解
2017/09/01 Javascript
基于JavaScript实现留言板功能
2020/03/16 Javascript
react 生命周期实例分析
2020/05/18 Javascript
Python通过select实现异步IO的方法
2015/06/04 Python
分析用Python脚本关闭文件操作的机制
2015/06/28 Python
解决python读取几千万行的大表内存问题
2018/06/26 Python
Python如何实现线程间通信
2020/07/30 Python
css3的图形3d翻转效果应用示例
2014/04/08 HTML / CSS
html5.2 dialog简介详解
2018/02/27 HTML / CSS
html5手机键盘弹出收起的处理
2020/01/20 HTML / CSS
Betsey Johnson官网:妖娆可爱的连衣裙及鞋子、手袋和配件
2016/12/30 全球购物
花园仓库建筑:Garden Buildings Direct
2018/02/16 全球购物
公务员政审单位鉴定材料
2014/05/16 职场文书
银行纠风工作实施方案
2014/06/08 职场文书
年终工作总结范文2014
2014/11/27 职场文书
毕业实习指导教师评语
2014/12/31 职场文书
雨中的树观后感
2015/06/03 职场文书