在Python當中,有一個輕量級的搜索工具,在日常使用的時候,用途還是比較廣的,這個工具就是Whoosh。那么,這個工具需要怎么進行使用呢?具體的代碼內容有哪些呢?下面就給大家進行詳細的解答。
Whoosh簡介
Whoosh由Matt Chaput創建,它一開始是一個為Houdini 3D動畫軟件包的在線文檔提供簡單、快速的搜索服務工具,隨著時代的發展,它慢慢的演變成了一個成熟的搜索工具,為了滿足更多人的需求,將它逐漸變成了一個開源的工具。
Whoosh純由Python編寫而成,使用起來比較簡單靈活,另外現在同時支持Python第二代,第三代,那么它的優點有哪些呢:
1、Whoosh純由Python代碼寫成的,安裝速度比較的快,安裝簡單,只需要Python環境即可,不需要編譯器;
2、默認使用Okapi BM25F排序算法,也支持其他排序算法;
3、相比于其他搜索引擎,Whoosh會創建更小的index文件;
4、Whoosh中的index文件編碼必須是unicode;
5、Whoosh可以儲存任意的Python對象。
Whoosh的官方介紹網站為:https://whoosh.readthedocs.io/en/latest/intro.html。相比于ElasticSearch或者Solr等成熟的搜索引擎工具,Whoosh顯得更輕便,操作更簡單,可以考慮在小型的搜索項目中使用。
Index&query
對于熟悉ES的人來說,搜索的兩個重要的方面為mapping和query,也就是索引的構建以及查詢,背后是復雜的索引儲存、query解析以及排序算法等。如果你有ES方面的經驗,那么,對于Whoosh是十分容易上手的。
按照筆者的理解以及Whoosh的官方文檔,Whoosh的入門使用主要是index以及query。搜索引擎的強大功能之一在于它能夠提供全文檢索,這依賴于排序算法,比如BM25,也依賴于我們怎樣儲存字段。因此,index作為名詞時,是指字段的索引,index作為動詞時,是指建立字段的索引。而query會將我們需要查詢的語句,通過排序算法,給出合理的搜索結果。
關于Whoosh的使用,在官文文檔中已經給出了詳細的說明,筆者在這里只給出一個簡單的例子,來說明Whoosh如何能方便地提升我們的搜索體驗。
實例代碼
本項目的示例數據為poem.csv,下圖為該數據集的前十行:
根據數據集的特征,我們創建四個字段(fields):title,dynasty,poet,content。創建的代碼如下:
#-*-coding:utf-8-*- import os from whoosh.index import create_in from whoosh.fields import* from jieba.analyse import ChineseAnalyzer import json #創建schema,stored為True表示能夠被檢索 schema=Schema(title=TEXT(stored=True,analyzer=ChineseAnalyzer()), dynasty=ID(stored=True), poet=ID(stored=True), content=TEXT(stored=True,analyzer=ChineseAnalyzer()) )
其中,ID只能為一個單元值,不能分割為若干個詞,常用于文件路徑、URL、日期、分類;
TEXT文件的文本內容,建立文本的索引并存儲,支持詞匯搜索;Analyzer選擇結巴中文分詞器。
接著,我們需要創建索引文件。我們利用程序先解析poem.csv文件,并將它轉化為index,寫入到indexdir目錄下。Python代碼如下:
#解析poem.csv文件 with open('poem.csv','r',encoding='utf-8')as f: texts=[_.strip().split(',')for _ in f.readlines()if len(_.strip().split(','))==4] #存儲schema信息至indexdir目錄 indexdir='indexdir/' if not os.path.exists(indexdir): os.mkdir(indexdir) ix=create_in(indexdir,schema) #按照schema定義信息,增加需要建立索引的文檔 writer=ix.writer() for i in range(1,len(texts)): title,dynasty,poet,content=texts<i> writer.add_document(title=title,dynasty=dynasty,poet=poet,content=content) writer.commit()
index創建成功后,我們就利用進行查詢。
比如我們想要查詢content中含有明月
的詩句,可以輸入以下代碼:
#創建一個檢索器 searcher=ix.searcher() #檢索content中出現'明月'的文檔 results=searcher.find("content","明月") print('一共發現%d份文檔。'%len(results)) for i in range(min(10,len(results))): print(json.dumps(results<i>.fields(),ensure_ascii=False))
輸出結果如下:
一共發現44份文檔。 前10份文檔如下: {"content":"床前明月光,疑是地上霜。舉頭望明月,低頭思故鄉。","dynasty":"唐代","poet":"李白","title":"靜夜思"} {"content":"邊草,邊草,邊草盡來兵老。山南山北雪晴,千里萬里月明。明月,明月,胡笳一聲愁絕。","dynasty":"唐代","poet":"戴叔倫","title":"調笑令·邊草"} {"content":"獨坐幽篁里,彈琴復長嘯。深林人不知,明月來相照。","dynasty":"唐代","poet":"王維","title":"竹里館"} {"content":"漢江明月照歸人,萬里秋風一葉身。休把客衣輕浣濯,此中猶有帝京塵。","dynasty":"明代","poet":"邊貢","title":"重贈吳國賓"} {"content":"秦時明月漢時關,萬里長征人未還。但使龍城飛將在,不教胡馬度陰山。","dynasty":"唐代","poet":"王昌齡","title":"出塞二首·其一"} {"content":"京口瓜洲一水間,鐘山只隔數重山。春風又綠江南岸,明月何時照我還?","dynasty":"宋代","poet":"王安石","title":"泊船瓜洲"} {"content":"四顧山光接水光,憑欄十里芰荷香。清風明月無人管,并作南樓一味涼。","dynasty":"宋代","poet":"黃庭堅","title":"鄂州南樓書事"} {"content":"青山隱隱水迢迢,秋盡江南草未凋。二十四橋明月夜,玉人何處教吹簫?","dynasty":"唐代","poet":"杜牧","title":"寄揚州韓綽判官"} {"content":"露氣寒光集,微陽下楚丘。猿啼洞庭樹,人在木蘭舟。廣澤生明月,蒼山夾亂流。云中君不見,竟夕自悲秋。","dynasty":"唐代","poet":"馬戴","title":"楚江懷古三首·其一"} {"content":"海上生明月,天涯共此時。情人怨遙夜,竟夕起相思。滅燭憐光滿,披衣覺露滋。不堪盈手贈,還寢夢佳期。","dynasty":"唐代","poet":"張九齡","title":"望月懷遠/望月懷古"}
綜上所述,關于Python使用工具,Whoosh介紹就給大家介紹到這里了,希望可以為各位讀者帶來幫助。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/127588.html
摘要:轉載說明來源添加全文搜索功能入門一使用的工具是的開源搜索框架,該框架支持搜索引擎,不用更改代碼,直接切換引擎,減少代碼量。修改如下添加修改為如下第二步在中修改引擎,如下第三步重建索引,在進行搜索中文試試吧。 感覺網絡上關于Django全文搜索的中文文章太少,并且講的也不是很到位,就是簡單介紹了怎么配置,并沒有說這樣配置有什么用,所以依然很迷茫。所以希望我這篇文章能夠幫助到后來人。 轉...
摘要:搜索引擎使用,是一個純實現的全文搜索引擎,小巧簡單。中文搜索需要進行中文分詞,使用。高亮部分的源碼位于和文件中,可復制進行修改,實現自定義高亮功能。 前言 django是python語言的一個web框架,功能強大。配合一些插件可為web網站很方便地添加搜索功能。 搜索引擎使用whoosh,是一個純python實現的全文搜索引擎,小巧簡單。 中文搜索需要進行中文分詞,使用jieba。 直...
摘要:貌似很少全文搜索的插件有一個但試了幾次都用不了所以參考自己寫了一個插件基于純編寫使用上很簡單創建更新刪除索引如果要對已存在的數據創建索引全部創建更新刪除如果只想要為指定的表創建索引自定義比如使用的中文分詞項目地址演示 flask 貌似很少全文搜索的插件,有一個 Flask-WhooshAlchemy , 但試了幾次都用不了,所以參考 Flask-WhooshAlchemy 自己寫了一個...
閱讀 910·2023-01-14 11:38
閱讀 877·2023-01-14 11:04
閱讀 740·2023-01-14 10:48
閱讀 1980·2023-01-14 10:34
閱讀 941·2023-01-14 10:24
閱讀 818·2023-01-14 10:18
閱讀 498·2023-01-14 10:09
閱讀 571·2023-01-14 10:02