中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python輕量級搜索工具Whoosh怎么使用

發布時間:2022-07-15 10:10:37 來源:億速云 閱讀:185 作者:iii 欄目:開發技術

這篇文章主要介紹了Python輕量級搜索工具Whoosh怎么使用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Python輕量級搜索工具Whoosh怎么使用文章都會有所收獲,下面我們一起來看看吧。

Whoosh簡介

Whoosh由Matt Chaput創建,它一開始是一個為Houdini 3D動畫軟件包的在線文檔提供簡單、快速的搜索服務工具,之后便慢慢成為一個成熟的搜索解決工具并已開源。

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

  • Whoosh純由Python編寫而成,但很快,只需要Python環境即可,不需要編譯器;

  • 默認使用 Okapi BM25F排序算法,也支持其他排序算法;

  • 相比于其他搜索引擎,Whoosh會創建更小的index文件;

  • Whoosh中的index文件編碼必須是unicode;

  • Whoosh可以儲存任意的Python對象。

Index & query

對于熟悉ES的人來說,搜索的兩個重要的方面為mapping和query,也就是索引的構建以及查詢,背后是復雜的索引儲存、query解析以及排序算法等。如果你有ES方面的經驗,那么,對于Whoosh是十分容易上手的。

按照筆者的理解以及Whoosh的官方文檔,Whoosh的入門使用主要是index以及query。搜索引擎的強大功能之一在于它能夠提供全文檢索,這依賴于排序算法,比如BM25,也依賴于我們怎樣儲存字段。因此,index作為名詞時,是指字段的索引,index作為動詞時,是指建立字段的索引。而query會將我們需要查詢的語句,通過排序算法,給出合理的搜索結果。

關于Whoosh的使用,在官文文檔中已經給出了詳細的說明,筆者在這里只給出一個簡單的例子,來說明Whoosh如何能方便地提升我們的搜索體驗。

示例代碼

數據

本項目的示例數據為poem.csv,下圖為該數據集的前十行:

Python輕量級搜索工具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": "黃庭堅 ", "title": "鄂州南樓書事"}
{"content": "青山隱隱水迢迢,秋盡江南草未凋。二十四橋明月夜,玉人何處教吹簫?", "dynasty": "唐代", "poet": "杜牧 ", "title": "寄揚州韓綽判官"}
{"content": "露氣寒光集,微陽下楚丘。猿啼洞庭樹,人在木蘭舟。廣澤生明月,蒼山夾亂流。云中君不見,竟夕自悲秋。", "dynasty": "唐代", "poet": "馬戴 ", "title": "楚江懷古三首·其一"}
{"content": "海上生明月,天涯共此時。情人怨遙夜,竟夕起相思。滅燭憐光滿,披衣覺露滋。不堪盈手贈,還寢夢佳期。", "dynasty": "唐代", "poet": "張九齡 ", "title": "望月懷遠 / 望月懷古"}

關于“Python輕量級搜索工具Whoosh怎么使用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Python輕量級搜索工具Whoosh怎么使用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东安县| 石泉县| 中方县| 大田县| 麻阳| 德化县| 衡山县| 临夏县| 虎林市| 红安县| 广州市| 新郑市| 叙永县| 黑水县| 芒康县| 西华县| 邹平县| 农安县| 宝坻区| 东方市| 宣威市| 蚌埠市| 宁化县| 噶尔县| 克东县| 巴楚县| 万载县| 达州市| 建平县| 芦溪县| 措勤县| 怀柔区| 溧水县| 寿光市| 柳州市| 新营市| 舒兰市| 金乡县| 长治县| 文成县| 永善县|