1. 程式人生 > 程式設計 >Python實現中英文全文搜尋的示例

Python實現中英文全文搜尋的示例

文章版權所有:州的先生部落格

原文地址: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 實現全文搜尋的資料請關注我們其它相關文章!