点击上方“编程派”,选择设为“设为星标”

优质文章,第一时间送达!

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

从简单的来说,搜索功能确实很简单,一个简单的 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

文末福利
考拉收集了 21 张 Python 代码速查表,每一张都是国外的大师总结的,非常实用 ~还有 2 张高清的 PyCharm 快捷键一览图,一张 Windows ,一张 Mac,放在桌面上,需要的时候打开一查,非常方便。。怎么获取呢?关注编程派公众号,回复关键词「f」获取
题图:pexels,CC0 授权

纯Python方案实现中英文全文搜索相关推荐

  1. 纯MongoDB实现中文全文搜索

    广州天勤数据有限公司 赖勇浩 摘要 MongoDB在2.4版中引入全文索引后几经迭代更新已经比较完美地支持以空格分隔的西语,但一直不支持中日韩等语言,社区版用户不得不通过挂接ElasticSearch ...

  2. 纯 MongoDB 实现中文全文搜索

    本文来自获得<2021MongoDB技术实践与应用案例征集活动>一等奖作品 摘要 MongoDB在2.4版中引入全文索引后几经迭代更新已经比较完美地支持以空格分隔的西语,但一直不支持中日韩 ...

  3. 程序员业务,微信全文搜索技术优化

    一.iOS微信全文搜索技术的现状 全文搜索是使用倒排索引进行搜索的一种搜索方式.倒排索引也称为反向索引,是指对输入的内容中的每个Token建立一个索引,索引中保存了这个Token在内容中的具体位置.全 ...

  4. 微信全文搜索技术优化

    一.iOS 微信全文搜索技术的现状 全文搜索是使用倒排索引进行搜索的一种搜索方式.倒排索引也称为反向索引,是指对输入的内容中的每个Token建立一个索引,索引中保存了这个Token在内容中的具体位置. ...

  5. python elasticsearch 入门教程(二) ---全文搜索

    python elasticsearch 入门教程(二) ---全文搜索 截止目前的搜索相对都很简单:单个姓名,通过年龄过滤.现在尝试下稍微高级点儿的全文搜索--一项 传统数据库确实很难搞定的任务. ...

  6. python 全文检索 whoosh flask_基于whoosh的flask全文搜索插件flask-msearch

    flask 的全文搜索插件很少,有个Flask-WhooshAlchemy,最近发现个flask-msearch,使用了下感觉不错. 安装flask-msearch pip install flask ...

  7. mysql全文索引中英文混合_MySQL 英文全文搜索和中文全文搜索 (FULLTEXT)

    MySQL 英文全文搜索实现步骤: 先建立一个数据库,采用utf8编码 CREATE DATABASE search DEFAULT CHARACTER SET utf8 COLLATE utf8_g ...

  8. 全文搜索!收藏这篇Solr ElasticSearch 长文就可以搞定

    转载自  全文搜索!收藏这篇Solr ElasticSearch 长文就可以搞定 摘自:JaJian`博кē Java后端技术编者说:文章从浅到深,描述了什么是全文搜索,为什么要使用全文搜索,Solr ...

  9. Haystack全文搜索

    Haystack 1.什么是Haystack Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),该框架支持Solr,Elasticsear ...

最新文章

  1. 《深入理解Java虚拟机》(第二版)学习2:垃圾收集算法
  2. php根据循环条件切换图片,thinkphp 循环显示图片问题!!!~~~~
  3. 【控制】《多智能体系统一致性协同演化控制理论与技术》纪良浩老师-第2章-周期间歇脉冲控制下多智能体系统一致性
  4. solidworks钣金插件_SolidWorks钣金设计实例:等径弯管
  5. 【数据结构】快速排序非递归算法及其改进
  6. 关于CI框架引入CSS与JS文件
  7. 基于JAVA+SpringMVC+Mybatis+MYSQL的田径运动会管理系统
  8. Java中集合list的add方法添加的不是值COPY而是地址
  9. mysql复制(高可用架构方案的基础)
  10. 连接数据库是显示无法连接到服务器,数据库无法连接到服务器怎么办(解决服务器连接故障的技巧)...
  11. php网站渗透实战_PHP网站安全-漏洞渗透及解决方式—概述
  12. 惯性导航算法matlab,基于MATLAB.Simulink的捷联惯性导航仿真
  13. SPSS25 软件安装教程(附带网盘资源)
  14. 计算机专业立项课题研究,计算机类课题研究选题参考
  15. php前台新闻调用,PHP 调用新浪滚动新闻
  16. 【MATLAB笔记】对矩阵进行满秩分解
  17. android 黄金颜色,金光闪闪-六款经典款黄金首饰推荐
  18. python中全局变量和局部变量关键字_Python中都全局变量和局部变量
  19. 业务入云是一条不归路
  20. 方正高影仪 linux驱动下载,方正Founder HD1000 驱动

热门文章

  1. 苹果iPhone X内置定制化神经引擎处理器
  2. 开水果店经营要考虑的因素,水果店开店考虑哪些
  3. [科普]嫦娥四号的中继卫星鹊桥,所处的拉格朗日L2点是什么?
  4. SolidWorks二次开发 API-SOLIDWORKS Simulation分析参数修改
  5. C# SolidWorks 二次开发 API ---草图中文字读取与修改
  6. Windows Server 2016服务器配置
  7. 2018深信服秋招C++笔试题
  8. 看完这篇 教你玩转渗透测试靶机vulnhub——FunBox2(ROOKIE)
  9. Linux环境部署:创建虚拟主机
  10. 恶意电子邮件通过谷歌云服务托管有效载荷