首頁  >  文章  >  後端開發  >  Python輕量級搜尋工具Whoosh的使用(總結分享)

Python輕量級搜尋工具Whoosh的使用(總結分享)

WBOY
WBOY轉載
2022-07-26 14:03:412924瀏覽

本篇文章為大家帶來了關於Python的相關知識,將為大家簡單介紹一下Python中的一個輕量級搜尋工具Whoosh,並給出相應的使用範例程式碼,下面一起來看一下,希望對大家有幫助。

Python輕量級搜尋工具Whoosh的使用(總結分享)

【相關推薦:Python3影片教學

本文將簡單介紹Python中的一個輕量級搜尋工具Whoosh,並給出相應的使用範例程式碼。

Whoosh簡介

Whoosh由Matt Chaput創建,它一開始是一個為Houdini 3D動畫軟體包的線上文件提供簡單、快速的搜尋服務工具,之後又慢慢成為一個成熟的搜尋解決工具並已開源。

Whoosh純粹由Python編寫而成,是一個靈活的,方便的,輕量級的搜尋引擎工具,現在同時支援Python2、3,其優點如下:

  • Whoosh純粹由Python編寫而成,但很快,只需要Python環境即可,不需要編譯器;
  • 預設使用Okapi BM25F排序演算法,也支援其他排序演算法;
  • 相比於其他搜尋引擎,Whoosh會創建更小的index檔;
  • Whoosh中的index檔編碼必須是unicode;
  • 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建立成功後,會產生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": "黃庭堅 ", "titletle", "poet": "黃庭堅 ", "titletle ": "鄂州南樓書事"}
{"content": "青山隱隱水迢迢,秋盡江南草未凋。二十四橋明月夜,玉人何處教吹簫?", "dynasty ": "唐代", "poet": "杜牧 ", "title": "寄揚州韓綽判官"}
{"content": "露氣寒光集,微陽下楚丘。猿叼洞庭庭樹,人在木蘭舟。廣澤生明月,蒼山夾亂流。雲中君不見,竟夕自悲秋。", "dynasty": "唐代", "poet": "馬戴 ", "title ": "楚江懷古三首·其一"}
{"content": "海上生明月,天涯共此時。情人怨遙夜,竟夕起相思。滅燭憐光滿,披衣覺露滋。不堪盈手贈,還寢夢佳期。", "dynasty": "唐代", "poet": "張九齡 ", "title": "望月懷遠 / 望月懷古"}

【相關推薦:Python3影片教學

以上是Python輕量級搜尋工具Whoosh的使用(總結分享)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:jb51.net。如有侵權,請聯絡admin@php.cn刪除