本文將簡單介紹Python中的一個輕量級搜索工具Whoosh,並給出相應的使用示例代碼。html
Whoosh由Matt Chaput建立,它一開始是一個爲Houdini 3D動畫軟件包的在線文檔提供簡單、快速的搜索服務工具,以後便慢慢成爲一個成熟的搜索解決工具並已開源。
Whoosh純由Python編寫而成,是一個靈活的,方便的,輕量級的搜索引擎工具,如今同時支持Python二、3,其優勢以下:python
Whoosh的官方介紹網站爲:https://whoosh.readthedocs.io... 。相比於ElasticSearch或者Solr等成熟的搜索引擎工具,Whoosh顯得更輕便,操做更簡單,能夠考慮在小型的搜索項目中使用。算法
對於熟悉ES的人來講,搜索的兩個重要的方面爲mapping和query,也就是索引的構建以及查詢,背後是複雜的索引儲存、query解析以及排序算法等。若是你有ES方面的經驗,那麼,對於Whoosh是十分容易上手的。
按照筆者的理解以及Whoosh的官方文檔,Whoosh的入門使用主要是index以及query。搜索引擎的強大功能之一在於它可以提供全文檢索,這依賴於排序算法,好比BM25,也依賴於咱們怎樣儲存字段。所以,index做爲名詞時,是指字段的索引,index做爲動詞時,是指創建字段的索引。而query會將咱們須要查詢的語句,經過排序算法,給出合理的搜索結果。
關於Whoosh的使用,在官文文檔中已經給出了詳細的說明,筆者在這裏只給出一個簡單的例子,來講明Whoosh如何能方便地提高咱們的搜索體檢。json
本項目的示例數據爲poem.csv,下圖爲該數據集的前十行:api
根據數據集的特徵,咱們建立四個字段(fields):title, dynasty, poet, content。建立的代碼以下:app
# -*- 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": "望月懷遠 / 望月懷古"}
本次分享到此到此結束,感謝你們閱讀~