Whoosh: Python 用の軽量検索ツール

PHPz
リリース: 2023-04-14 21:07:01
転載
1633 人が閲覧しました

Whoosh: Python 用の軽量検索ツール

Whoosh の紹介

Whoosh は Matt Chaput によって作成され、Houdini 3D アニメーション ソフトウェア パッケージのオンライン ドキュメントのシンプルかつ高速な検索サービス ツールとして始まりました。は徐々に成熟した検索ソリューション ツールとなり、オープンソースになりました。

Whoosh は純粋に Python で書かれています。柔軟で便利な軽量の検索エンジン ツールです。Python2 と 3 の両方をサポートするようになりました。その利点は次のとおりです:

  • Whoosh は次のとおりです。純粋に Python で書かれていますが、非常に高速です。Python 環境のみが必要で、コンパイラは必要ありません。
  • デフォルトでは、Okapi BM25F ソート アルゴリズムが使用され、他のソート アルゴリズムもサポートされています。
  • 他の検索エンジンと比較して、Whoosh はより小さなインデックス ファイルを作成します;
  • Whoosh のインデックス ファイルのエンコードは Unicode である必要があります;
  • Whoosh は任意の Python オブジェクトを保存できます。

Whoosh の公式紹介 Web サイトは、https://whoosh.readthedocs.io/en/latest/intro.html です。 ElasticSearch や Solr などの成熟した検索エンジン ツールと比較して、Whoosh は軽量で操作が簡単なので、小規模な検索プロジェクトでの使用を検討できます。

インデックスとクエリ

ES に精通している人にとって、検索の 2 つの重要な側面はマッピングとクエリ、つまりインデックス構築とクエリです。舞台裏には複雑なインデックス ストレージとクエリ解析があります。ソートアルゴリズムなど。 ES の経験がある場合、Whoosh は非常に簡単に始めることができます。

著者の理解と Whoosh の公式ドキュメントによれば、Whoosh の主な入門用途はインデックスとクエリです。検索エンジンの強力な機能の 1 つは、全文検索を提供できることです。これは、BM25 などの並べ替えアルゴリズムに依存し、フィールドの保存方法にも依存します。したがって、index が名詞として使用される場合はフィールドのインデックスを指し、index が動詞として使用される場合はフィールドのインデックスを確立することを指します。クエリは並べ替えアルゴリズムを使用して、クエリが必要なステートメントに基づいて適切な検索結果を提供します。

Whoosh の使用方法については、公式ドキュメントに詳細な説明が記載されていますが、ここでは、Whoosh がどのように簡単に検索エクスペリエンスを向上させることができるかを説明するために、著者は簡単な例のみを示しています。

#サンプル コード

データ

このプロジェクトのサンプル データは詩.csv です。次の図はデータ セットの最初の 10 行です:

Whoosh: Python 用の軽量検索ツール

poem.csv

Fields

データセットの特性に基づいて、タイトル、王朝、詩人、内容の 4 つのフィールド (フィールド) を作成します。 。

# -*- 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 ファイルのテキスト コンテンツ、テキストのインデックス付けと保存、および単語検索のサポート。アナライザーは吃音中国語単語セグメンターを選択します。

インデックス ファイルの作成

次に、インデックス ファイルを作成する必要があります。このプログラムを使用して、最初にpoem.csvファイルを解析し、それをインデックスに変換し、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()
ログイン後にコピー

インデックスが正常に作成されると、indexdir ディレクトリが生成されます。このディレクトリには、上記の poem.csv データの各フィールドのインデックス ファイルが含まれます。

Query

インデックスが正常に作成されたら、それを使用してクエリを実行します。

たとえば、コンテンツに明るい月が含まれる詩をクエリする場合は、次のコードを入力できます:

# 创建一个检索器
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": "海上生明月,天涯共此时。情人怨遥夜,竟夕起相思。灭烛怜光满,披衣觉露滋。不堪盈手赠,
ログイン後にコピー

以上がWhoosh: Python 用の軽量検索ツールの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:51cto.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート