文章版權所有:州的先生博客
原文地址:https://zmister.com/archives/1596.html
在互聯網上的各類網站中,無論大小,基本上都會有一個搜索框,用來給用戶對內容進行搜索,小到站點搜索,大到搜索引擎搜索。
從簡單的來說,搜索功能確實很簡單,一個簡單的 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 搜索引擎
在 /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
以上就是Python實現中英文全文搜索的示例的詳細內容,更多關于python 實現全文搜索的資料請關注我們其它相關文章!
原文鏈接:https://zmister.com/archives/1596.html