您好,登錄后才能下訂單哦!
這篇文章主要講解了“Python輕量級(jí)搜索工具Whoosh如何使用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Python輕量級(jí)搜索工具Whoosh如何使用”吧!
Whoosh由Matt Chaput創(chuàng)建,它一開始是一個(gè)為Houdini 3D動(dòng)畫軟件包的在線文檔提供簡單、快速的搜索服務(wù)工具,之后便慢慢成為一個(gè)成熟的搜索解決工具并已開源。
Whoosh純由Python編寫而成,是一個(gè)靈活的,方便的,輕量級(jí)的搜索引擎工具,現(xiàn)在同時(shí)支持Python2、3,其優(yōu)點(diǎn)如下:
Whoosh純由Python編寫而成,但很快,只需要Python環(huán)境即可,不需要編譯器;
默認(rèn)使用 Okapi BM25F排序算法,也支持其他排序算法;
相比于其他搜索引擎,Whoosh會(huì)創(chuàng)建更小的index文件;
Whoosh中的index文件編碼必須是unicode;
Whoosh可以儲(chǔ)存任意的Python對(duì)象。
對(duì)于熟悉ES的人來說,搜索的兩個(gè)重要的方面為mapping和query,也就是索引的構(gòu)建以及查詢,背后是復(fù)雜的索引儲(chǔ)存、query解析以及排序算法等。如果你有ES方面的經(jīng)驗(yàn),那么,對(duì)于Whoosh是十分容易上手的。
按照筆者的理解以及Whoosh的官方文檔,Whoosh的入門使用主要是index以及query。搜索引擎的強(qiáng)大功能之一在于它能夠提供全文檢索,這依賴于排序算法,比如BM25,也依賴于我們?cè)鯓觾?chǔ)存字段。因此,index作為名詞時(shí),是指字段的索引,index作為動(dòng)詞時(shí),是指建立字段的索引。而query會(huì)將我們需要查詢的語句,通過排序算法,給出合理的搜索結(jié)果。
本項(xiàng)目的示例數(shù)據(jù)為poem.csv,下圖為該數(shù)據(jù)集的前十行:
根據(jù)數(shù)據(jù)集的特征,我們創(chuàng)建四個(gè)字段(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只能為一個(gè)單元值,不能分割為若干個(gè)詞,常用于文件路徑、URL、日期、分類;
TEXT文件的文本內(nèi)容,建立文本的索引并存儲(chǔ),支持詞匯搜索;Analyzer選擇結(jié)巴中文分詞器。
接著,我們需要?jiǎ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] # 存儲(chǔ)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)建成功后,會(huì)生成indexdir目錄,里面含有上述poem.csv數(shù)據(jù)的各個(gè)字段的索引文件。
index創(chuàng)建成功后,我們就利用進(jìn)行查詢。
比如我們想要查詢content中含有明月
的詩句,可以輸入以下代碼:
# 創(chuàng)建一個(gè)檢索器 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": "重贈(zèng)吳國賓"}
{"content": "秦時(shí)明月漢時(shí)關(guān),萬里長征人未還。但使龍城飛將在,不教胡馬度陰山。", "dynasty": "唐代", "poet": "王昌齡 ", "title": "出塞二首·其一"}
{"content": "京口瓜洲一水間,鐘山只隔數(shù)重山。春風(fēng)又綠江南岸,明月何時(shí)照我還?", "dynasty": "宋代", "poet": "王安石 ", "title": "泊船瓜洲"}
{"content": "四顧山光接水光,憑欄十里芰荷香。清風(fēng)明月無人管,并作南樓一味涼。", "dynasty": "宋代", "poet": "黃庭堅(jiān) ", "title": "鄂州南樓書事"}
{"content": "青山隱隱水迢迢,秋盡江南草未凋。二十四橋明月夜,玉人何處教吹簫?", "dynasty": "唐代", "poet": "杜牧 ", "title": "寄揚(yáng)州韓綽判官"}
{"content": "露氣寒光集,微陽下楚丘。猿啼洞庭樹,人在木蘭舟。廣澤生明月,蒼山夾亂流。云中君不見,竟夕自悲秋。", "dynasty": "唐代", "poet": "馬戴 ", "title": "楚江懷古三首·其一"}
{"content": "海上生明月,天涯共此時(shí)。情人怨遙夜,竟夕起相思。滅燭憐光滿,披衣覺露滋。不堪盈手贈(zèng),還寢夢(mèng)佳期。", "dynasty": "唐代", "poet": "張九齡 ", "title": "望月懷遠(yuǎn) / 望月懷古"}
感謝各位的閱讀,以上就是“Python輕量級(jí)搜索工具Whoosh如何使用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Python輕量級(jí)搜索工具Whoosh如何使用這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。