Python輕量級搜索工具Whoosh的使用教程
本文將簡單介紹Python中的一個輕量級搜索工具Whoosh,并給出相應(yīng)的使用示例代碼。
Whoosh簡介
Whoosh由Matt Chaput創(chuàng)建,它一開始是一個為Houdini 3D動畫軟件包的在線文檔提供簡單、快速的搜索服務(wù)工具,之后便慢慢成為一個成熟的搜索解決工具并已開源。
Whoosh純由Python編寫而成,是一個靈活的,方便的,輕量級的搜索引擎工具,現(xiàn)在同時支持Python2、3,其優(yōu)點(diǎn)如下:
- Whoosh純由Python編寫而成,但很快,只需要Python環(huán)境即可,不需要編譯器;
- 默認(rèn)使用 Okapi BM25F排序算法,也支持其他排序算法;
- 相比于其他搜索引擎,Whoosh會創(chuàng)建更小的index文件;
- Whoosh中的index文件編碼必須是unicode;
- Whoosh可以儲存任意的Python對象。
Whoosh的官方介紹網(wǎng)站為:https://whoosh.readthedocs.io/en/latest/intro.html。相比于ElasticSearch或者Solr等成熟的搜索引擎工具,Whoosh顯得更輕便,操作更簡單,可以考慮在小型的搜索項(xiàng)目中使用。
Index & query
對于熟悉ES的人來說,搜索的兩個重要的方面為mapping和query,也就是索引的構(gòu)建以及查詢,背后是復(fù)雜的索引儲存、query解析以及排序算法等。如果你有ES方面的經(jīng)驗(yàn),那么,對于Whoosh是十分容易上手的。
按照筆者的理解以及Whoosh的官方文檔,Whoosh的入門使用主要是index以及query。搜索引擎的強(qiáng)大功能之一在于它能夠提供全文檢索,這依賴于排序算法,比如BM25,也依賴于我們怎樣儲存字段。因此,index作為名詞時,是指字段的索引,index作為動詞時,是指建立字段的索引。而query會將我們需要查詢的語句,通過排序算法,給出合理的搜索結(jié)果。
關(guān)于Whoosh的使用,在官文文檔中已經(jīng)給出了詳細(xì)的說明,筆者在這里只給出一個簡單的例子,來說明Whoosh如何能方便地提升我們的搜索體驗(yàn)。
示例代碼
數(shù)據(jù)
本項(xiàng)目的示例數(shù)據(jù)為poem.csv,下圖為該數(shù)據(jù)集的前十行:
poem.csv
字段
根據(jù)數(shù)據(jù)集的特征,我們創(chuàng)建四個字段(fields):title, dynasty, poet, content。創(chuàng)建的代碼如下:
#?-*-?coding:?utf-8?-*- import?os from?whoosh.index?import?create_in from?whoosh.fields?import?* from?jieba.analyse?import?ChineseAnalyzer import?json #?創(chuàng)建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文件的文本內(nèi)容,建立文本的索引并存儲,支持詞匯搜索;Analyzer選擇結(jié)巴中文分詞器。
創(chuàng)建索引文件
接著,我們需要創(chuàng)建索引文件。我們利用程序先解析poem.csv文件,并將它轉(zhuǎn)化為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創(chuàng)建成功后,會生成indexdir目錄,里面含有上述poem.csv數(shù)據(jù)的各個字段的索引文件。
查詢
index創(chuàng)建成功后,我們就利用進(jìn)行查詢。
比如我們想要查詢content中含有明月
的詩句,可以輸入以下代碼:
#?創(chuàng)建一個檢索器 searcher?=?ix.searcher() #?檢索content中出現(xiàn)'明月'的文檔 results?=?searcher.find("content",?"明月") print('一共發(fā)現(xiàn)%d份文檔。'?%?len(results)) for?i?in?range(min(10,?len(results))): ????print(json.dumps(results[i].fields(),?ensure_ascii=False))
輸出結(jié)果如下:
一共發(fā)現(xiàn)44份文檔。
前10份文檔如下:
{"content":"床前明月光,疑是地上霜。舉頭望明月,低頭思故鄉(xiāng)。","dynasty":"唐代","poet":"李白","title":"靜夜思"}
{"content":"邊草,邊草,邊草盡來兵老。山南山北雪晴,千里萬里月明。明月,明月,胡笳一聲愁絕。","dynasty":"唐代","poet":"戴叔倫","title":"調(diào)笑令·邊草"}
{"content":"獨(dú)坐幽篁里,彈琴復(fù)長嘯。深林人不知,明月來相照。","dynasty":"唐代","poet":"王維","title":"竹里館"}
{"content":"漢江明月照歸人,萬里秋風(fēng)一葉身。休把客衣輕浣濯,此中猶有帝京塵。","dynasty":"明代","poet":"邊貢","title":"重贈吳國賓"}
{"content":"秦時明月漢時關(guān),萬里長征人未還。但使龍城飛將在,不教胡馬度陰山。","dynasty":"唐代","poet":"王昌齡","title":"出塞二首·其一"}
{"content":"京口瓜洲一水間,鐘山只隔數(shù)重山。春風(fēng)又綠江南岸,明月何時照我還?","dynasty":"宋代","poet":"王安石","title":"泊船瓜洲"}
{"content":"四顧山光接水光,憑欄十里芰荷香。清風(fēng)明月無人管,并作南樓一味涼。","dynasty":"宋代","poet":"黃庭堅(jiān)","title":"鄂州南樓書事"}
{"content":"青山隱隱水迢迢,秋盡江南草未凋。二十四橋明月夜,玉人何處教吹簫?","dynasty":"唐代","poet":"杜牧","title":"寄揚(yáng)州韓綽判官"}
{"content":"露氣寒光集,微陽下楚丘。猿啼洞庭樹,人在木蘭舟。廣澤生明月,蒼山夾亂流。云中君不見,竟夕自悲秋。","dynasty":"唐代","poet":"馬戴","title":"楚江懷古三首·其一"}
{"content":"海上生明月,天涯共此時。情人怨遙夜,竟夕起相思。滅燭憐光滿,披衣覺露滋。不堪盈手贈,還寢夢佳期。","dynasty":"唐代","poet":"張九齡","title":"望月懷遠(yuǎn)/望月懷古"}
到此這篇關(guān)于Python輕量級搜索工具Whoosh的使用教程的文章就介紹到這了,更多相關(guān)Python搜索工具Whoosh內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。