純Python方案實現中英文全文搜索

在互聯網上的各種網站中,不管大小,基本上都會有一個搜索框,用來給用戶對內容進行搜索,小到站點搜索,大到搜索引擎搜索。html

從簡單的來講,搜索功能確實很簡單,一個簡單的 select 語句就能夠實現數據的搜索。python

而從複雜的來看,不管是搜索的精度仍是搜索的效率,都是有很深的研究範圍的。git

對於簡單的搜索功能來講,一個 select 查詢語句也足夠使用,但在稍微複雜一點的搜索環境下,好比網頁、文檔、新聞資訊等場景,單純的 select 查詢語句則是遠遠不夠。在這些場景下的搜索,全文搜索則是最低配置。github

什麼是全文搜索?百度百科如是說:web

全文數據庫是全文檢索系統的主要構成部分。所謂全文數據庫是將一個完整的信息源的所有內容轉化爲計算機能夠識別、處理的信息單元而造成的數據集合。全文數據庫不只存儲了信息,並且還有對全文數據進行詞、字、段落等更深層次的編輯、加工的功能,並且全部全文數據庫無一不是海量信息數據庫。數據庫

是否是看得不明不白的?講一個簡單的例子大概就理解了。正常狀況下,咱們搜索「Python 安裝教程」,若是是普通的搜索,會直接使用 select 數據庫中包含「Python 安裝教程」的內容。可是全文搜索,會首先將搜索詞拆分紅:「Python 安裝教程」、「Python」、「安裝教程」、「安裝」、「教程」等,而後用這些拆分後的詞組進行搜索。django

市面上全部的搜索引擎都使用了全文搜索:微信

最近「MrDoc 交流羣」裏讓覓道文檔添加上全文搜索的呼聲很高,遂打算在覓道文檔中把常規的 select 查詢搜索替換爲全文搜索。app

最多見的開源全文搜索引擎是 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 文件中進行配置。

第1、在 INSTALLED_APPS 中添加 haystack 庫:

第2、添加配置 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


🧐分享、點贊、在看,給個三連擊唄!👇

本文分享自微信公衆號 - 州的先生(zmister2016)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索