亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python實(shí)現(xiàn)中英文全文搜索的示例

 更新時(shí)間:2020年12月04日 09:42:47   作者:州的先生  
這篇文章主要介紹了Python實(shí)現(xiàn)中英文全文搜索的示例,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下

文章版權(quán)所有:州的先生博客

原文地址:https://zmister.com/archives/1596.html

在互聯(lián)網(wǎng)上的各類(lèi)網(wǎng)站中,無(wú)論大小,基本上都會(huì)有一個(gè)搜索框,用來(lái)給用戶對(duì)內(nèi)容進(jìn)行搜索,小到站點(diǎn)搜索,大到搜索引擎搜索。

從簡(jiǎn)單的來(lái)說(shuō),搜索功能確實(shí)很簡(jiǎn)單,一個(gè)簡(jiǎn)單的 select 語(yǔ)句就可以實(shí)現(xiàn)數(shù)據(jù)的搜索。

而從復(fù)雜的來(lái)看,無(wú)論是搜索的精度還是搜索的效率,都是有很深的研究范圍的。

對(duì)于簡(jiǎn)單的搜索功能來(lái)說(shuō),一個(gè) select 查詢語(yǔ)句也足夠使用,但在稍微復(fù)雜一點(diǎn)的搜索環(huán)境下,比如網(wǎng)頁(yè)、文檔、新聞資訊等場(chǎng)景,單純的 select 查詢語(yǔ)句則是遠(yuǎn)遠(yuǎn)不夠。在這些場(chǎng)景下的搜索,全文搜索則是最低配置。

什么是全文搜索?百度百科如是說(shuō):

全文數(shù)據(jù)庫(kù)是全文檢索系統(tǒng)的主要構(gòu)成部分。所謂全文數(shù)據(jù)庫(kù)是將一個(gè)完整的信息源的全部?jī)?nèi)容轉(zhuǎn)化為計(jì)算機(jī)可以識(shí)別、處理的信息單元而形成的數(shù)據(jù)集合。全文數(shù)據(jù)庫(kù)不僅存儲(chǔ)了信息,而且還有對(duì)全文數(shù)據(jù)進(jìn)行詞、字、段落等更深層次的編輯、加工的功能,而且所有全文數(shù)據(jù)庫(kù)無(wú)一不是海量信息數(shù)據(jù)庫(kù)。

是不是看得不明不白的?講一個(gè)簡(jiǎn)單的例子大概就理解了。正常情況下,我們搜索“Python 安裝教程”,如果是普通的搜索,會(huì)直接使用 select 數(shù)據(jù)庫(kù)中包含“Python 安裝教程”的內(nèi)容。但是全文搜索,會(huì)首先將搜索詞拆分成:“Python 安裝教程”、“Python”、“安裝教程”、“安裝”、“教程”等,然后用這些拆分后的詞組進(jìn)行搜索。

市面上所有的搜索引擎都使用了全文搜索:

最近“MrDoc 交流群”里讓覓道文檔添加上全文搜索的呼聲很高,遂打算在覓道文檔中把常規(guī)的 select 查詢搜索替換為全文搜索。

最常見(jiàn)的開(kāi)源全文搜索引擎是 Elasticsearch,功能強(qiáng)大、性能強(qiáng)悍,但是其基于 Java 進(jìn)行編寫(xiě),在 Python 中使用不是很方便,最終州的先生選擇了純 Python 實(shí)現(xiàn)的全文搜索引擎——whoosh,并借助 Django 下的開(kāi)源搜索框架——haystack,依靠 jieba 中文分詞庫(kù),在覓道文檔這一典型 Python Web 應(yīng)用中實(shí)現(xiàn)了中英文的全文搜索。

安裝依賴庫(kù)

如上述所言,本次純 Python 方案實(shí)現(xiàn)中英文全文搜索使用到了如下 3 個(gè)庫(kù):

  • whoosh
  • haystack
  • jieba

需要對(duì)其進(jìn)行安裝,使用 pip 命令進(jìn)行安裝即可:

pip install whoosh
pip install django-haystack
pip install jieba

settings 配置

首先需要在 Django 項(xiàng)目的 settings.py 文件中進(jìn)行配置。

第一、在 INSTALLED_APPS 中添加 haystack 庫(kù):

第二、添加配置 haystack 的配置項(xiàng)

# 當(dāng)添加、修改、刪除數(shù)據(jù)時(shí),自動(dòng)生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
# 自定義高亮
HAYSTACK_CUSTOM_HIGHLIGHTER = "app_doc.search.highlight.MyHighLighter"

創(chuàng)建索引

在 app_doc 目錄下新建一個(gè)名為 search_indexes.py 的文件,在其中輸入如下內(nèi)容:

在 template 目錄下新建一色名為 search 的目錄,然后在 search 目錄下新建一個(gè)名為 indexes 的目錄,接著在其中新建一個(gè)名為 app_doc 的目錄(與 Django 應(yīng)用同名),最后在這個(gè)/template/search/app_doc 目錄下新建一個(gè)名稱 doc_text.txt 的文件(模型名稱_text.txt),在其中輸入需要索引的模型字段:

{{object.name}}
{{object.pre_content}}

創(chuàng)建中文分詞器

由于 whoosh 對(duì)中文的分詞能力不行,如果我們搜索中文,其八成不會(huì)對(duì)其進(jìn)行分詞,所以我們額外引入了 jieba 模塊來(lái)進(jìn)行中文分詞。

在 /MrDoc/app_doc/search 目錄下新建一個(gè)名為 chines_analyzer.py 的文件,在其中寫(xiě)入如下代碼:

自定義 whoosh 搜索引擎

在 /MrDoc/app_doc/search 目錄下新建一個(gè)名為 whoosh_cn_backend.py 的文件(這個(gè)路徑文件即是我們?cè)?settings.py 文件中指定的引擎路徑),復(fù)制 python 安裝路徑\Lib\site-packages\haystack\backends\whoosh_backend.py 的內(nèi)容到這個(gè)文件中,并做如下修改:

from whoosh.analysis import StemmingAnalyzer

替換為:

from app_doc.search.chinese_analyzer import ChineseAnalyzer as StemmingAnalyzer

這樣,我們自定義能夠進(jìn)行中文分詞的 whoosh 引擎就完成了。

編寫(xiě)視圖函數(shù)

完成上述步驟之后,全文搜索引擎幕后的工作就已經(jīng)完成了,我們接下來(lái)需要按照 Django 的方式,編寫(xiě)邏輯視圖,并進(jìn)行 HTML 模板的渲染。

在這里,州的先生在/MrDoc/app_doc/下新建了一個(gè)名為 views_search.py 的文件來(lái)放置全文搜索的視圖函數(shù),繼承 haystack.views.SearchView 類(lèi),自定義了一個(gè)全文搜索視圖類(lèi):

HTML 模板渲染

全文搜索引擎的數(shù)據(jù)默認(rèn)返回在了特定的 HTML 模板中,州的先生沒(méi)有對(duì)此進(jìn)行自定義,所以按照 haystack 的要求,在 template/search 目錄下新建了一個(gè)名為 search.html 的模板文件,對(duì)全文搜索視圖類(lèi)返回的搜索數(shù)據(jù)集進(jìn)行渲染解析。

生成索引

最后我們需要在命令行終端生成一下索引文件,使用如下命令:

python manage.py rebuild_index

這樣,就實(shí)現(xiàn)了純 Python 方案的中英文全文搜索,效果如下動(dòng)圖所示:

文中所涉代碼均為 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實(shí)現(xiàn)中英文全文搜索的示例的詳細(xì)內(nèi)容,更多關(guān)于python 實(shí)現(xiàn)全文搜索的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python-圖片流傳輸?shù)乃悸芳笆纠?url轉(zhuǎn)換二維碼)

    python-圖片流傳輸?shù)乃悸芳笆纠?url轉(zhuǎn)換二維碼)

    這篇文章主要介紹了python-圖片流傳輸?shù)乃悸芳笆纠?url轉(zhuǎn)換二維碼),幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • Python3 chardet模塊查看編碼格式的例子

    Python3 chardet模塊查看編碼格式的例子

    今天小編就為大家分享一篇Python3 chardet模塊查看編碼格式的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • Pandas分組聚合之使用自定義函數(shù)方法transform()、apply()

    Pandas分組聚合之使用自定義函數(shù)方法transform()、apply()

    Pandas具有很多強(qiáng)大的功能,transform就是其中之一,利用它可以高效地匯總數(shù)據(jù)且不改變數(shù)據(jù)行數(shù),下面這篇文章主要給大家介紹了關(guān)于Pandas分組聚合之使用自定義函數(shù)方法transform()、apply()的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • python實(shí)現(xiàn)用戶管理系統(tǒng)

    python實(shí)現(xiàn)用戶管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)用戶管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • python+Selenium自動(dòng)化測(cè)試——輸入,點(diǎn)擊操作

    python+Selenium自動(dòng)化測(cè)試——輸入,點(diǎn)擊操作

    這篇文章主要介紹了python+Selenium自動(dòng)化測(cè)試——輸入,點(diǎn)擊操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • python mysql斷開(kāi)重連的實(shí)現(xiàn)方法

    python mysql斷開(kāi)重連的實(shí)現(xiàn)方法

    這篇文章主要介紹了python mysql斷開(kāi)重連的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 超詳細(xì)注釋之OpenCV實(shí)現(xiàn)視頻實(shí)時(shí)人臉模糊和人臉馬賽克

    超詳細(xì)注釋之OpenCV實(shí)現(xiàn)視頻實(shí)時(shí)人臉模糊和人臉馬賽克

    這篇文章主要介紹了OpenCV實(shí)現(xiàn)視頻實(shí)時(shí)人臉模糊和人臉馬賽克,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Python函數(shù)__new__及__init__作用及區(qū)別解析

    Python函數(shù)__new__及__init__作用及區(qū)別解析

    這篇文章主要介紹了Python函數(shù)__new__及__init__作用及區(qū)別解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 一文搞懂Python中列表List和元組Tuple的使用

    一文搞懂Python中列表List和元組Tuple的使用

    列表List 和 元組Tuple 可以說(shuō)是 Python 中最通用、最有用的數(shù)據(jù)類(lèi)型。列表是動(dòng)態(tài)的,而元組具有靜態(tài)特征。本文將通過(guò)示例詳細(xì)講解二者的使用方法,需要的可以參考一下
    2022-04-04
  • Python中scatter函數(shù)參數(shù)及用法詳解

    Python中scatter函數(shù)參數(shù)及用法詳解

    這篇文章主要介紹了Python中scatter函數(shù)參數(shù)及用法詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11

最新評(píng)論