<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文將簡單介紹Python中的一個輕量級搜尋工具Whoosh,並給出相應的使用範例程式碼。
Whoosh由Matt Chaput建立,它一開始是一個為Houdini 3D動畫軟體包的線上檔案提供簡單、快速的搜尋服務工具,之後便慢慢成為一個成熟的搜尋解決工具並已開源。
Whoosh純由Python編寫而成,是一個靈活的,方便的,輕量級的搜尋引擎工具,現在同時支援Python2、3,其優點如下:
Whoosh的官方介紹網站為:https://whoosh.readthedocs.io/en/latest/intro.html。相比於ElasticSearch或者Solr等成熟的搜尋引擎工具,Whoosh顯得更輕便,操作更簡單,可以考慮在小型的搜尋專案中使用。
對於熟悉ES的人來說,搜尋的兩個重要的方面為mapping和query,也就是索引的構建以及查詢,背後是複雜的索引儲存、query解析以及排序演演算法等。如果你有ES方面的經驗,那麼,對於Whoosh是十分容易上手的。
按照筆者的理解以及Whoosh的官方檔案,Whoosh的入門使用主要是index以及query。搜尋引擎的強大功能之一在於它能夠提供全文檢索,這依賴於排序演演算法,比如BM25,也依賴於我們怎樣儲存欄位。因此,index作為名詞時,是指欄位的索引,index作為動詞時,是指建立欄位的索引。而query會將我們需要查詢的語句,通過排序演演算法,給出合理的搜尋結果。
關於Whoosh的使用,在官文檔案中已經給出了詳細的說明,筆者在這裡只給出一個簡單的例子,來說明Whoosh如何能方便地提升我們的搜尋體驗。
本專案的範例資料為poem.csv,下圖為該資料集的前十行:
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建立成功後,會生成indexdir目錄,裡面含有上述poem.csv資料的各個欄位的索引檔案。
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的使用教學的文章就介紹到這了,更多相關Python搜尋工具Whoosh內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45