Heim  >  Artikel  >  Backend-Entwicklung  >  Whoosh: Ein leichtes Suchtool für Python

Whoosh: Ein leichtes Suchtool für Python

PHPz
PHPznach vorne
2023-04-14 21:07:011558Durchsuche

Whoosh: Ein leichtes Suchtool für Python

Einführung in Whoosh

Whoosh wurde als einfaches und schnelles Suchdiensttool für die Online-Dokumentation des Houdini 3D-Animationssoftwarepakets entwickelt und hat sich seitdem langsam zu einer ausgereiften Suchlösung entwickelt Open Source.

Whoosh ist ausschließlich in Python geschrieben. Es unterstützt jetzt sowohl Python2 als auch 3. Seine Vorteile sind wie folgt:

  • Whoosh ist ausschließlich in Python geschrieben, aber es ist sehr schnell , erfordert nur eine Python-Umgebung, kein Compiler erforderlich;
  • Okapi BM25F Sortieralgorithmus wird ebenfalls unterstützt
  • Im Vergleich zu anderen Suchmaschinen erstellt Whoosh kleinere Indexdateien; Die Codierung muss Unicode sein.
  • Whoosh kann jedes Python-Objekt speichern.
  • Die offizielle Einführungswebsite von Whoosh ist: https://whoosh.readthedocs.io/en/latest/intro.html. Im Vergleich zu ausgereiften Suchmaschinentools wie ElasticSearch oder Solr ist Whoosh leichter und einfacher zu bedienen und kann für den Einsatz in kleinen Suchprojekten in Betracht gezogen werden.

Index und Abfrage

Für diejenigen, die mit ES vertraut sind, sind die beiden wichtigen Aspekte der Suche Zuordnung und Abfrage, dh Indexkonstruktion und Abfrage, hinter denen komplexe Indexspeicher-, Abfrageanalyse- und Sortieralgorithmen stehen. Wenn Sie Erfahrung mit ES haben, ist der Einstieg mit Whoosh sehr einfach.

Nach dem Verständnis des Autors und der offiziellen Dokumentation von Whoosh besteht die einführende Verwendung von Whoosh hauptsächlich aus Index und Abfrage. Eine der leistungsstarken Funktionen einer Suchmaschine besteht darin, dass sie eine Volltextsuche bereitstellen kann, die vom Sortieralgorithmus wie BM25 und auch davon abhängt, wie wir Felder speichern. Wenn Index als Substantiv verwendet wird, bezieht es sich daher auf den Index des Felds, und wenn Index als Verb verwendet wird, bezieht es sich auf die Festlegung des Index des Felds. Die Abfrage verwendet den Sortieralgorithmus, um basierend auf den abzufragenden Aussagen vernünftige Suchergebnisse zu liefern.

Bezüglich der Verwendung von Whoosh wurden in den offiziellen Dokumenten detaillierte Anweisungen gegeben. Der Autor gibt hier nur ein einfaches Beispiel, um zu veranschaulichen, wie Whoosh unser Sucherlebnis leicht verbessern kann.

Beispielcode

Daten

Die Beispieldaten dieses Projekts sind poet.csv. Das folgende Bild zeigt die ersten zehn Zeilen des Datensatzes:

Whoosh: Ein leichtes Suchtool für Pythonpoem.csv

Felder

Entsprechend den Merkmalen Für den Datensatz erstellen wir vier Felder: Titel, Dynastie, Dichter, Inhalt. Der erstellte Code lautet wie folgt:

# -*- 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())
 )

Unter diesen kann die ID nur ein Einheitswert sein und nicht in mehrere Wörter unterteilt werden. Sie wird häufig für Dateipfade, URLs, Daten und Klassifizierungen verwendet. Erstellen Sie einen Index des Textes und speichern Sie ihn. Unterstützt die Wortsuche. Der Analysator wählt stotternde chinesische Wörter aus.

Indexdatei erstellen

Als nächstes müssen wir die Indexdatei erstellen. Wir verwenden das Programm, um zunächst die Datei „poem.csv“ zu analysieren, sie in einen Index umzuwandeln und sie in das Verzeichnis „indexdir“ zu schreiben. Der Python-Code lautet wie folgt:

# 解析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()

Nachdem der Index erfolgreich erstellt wurde, wird das Verzeichnis indexdir generiert, das die Indexdateien für jedes Feld der oben genannten poet.csv-Daten enthält.

Abfrage

Nachdem der Index erfolgreich erstellt wurde, verwenden wir ihn zur Abfrage.

Wenn wir beispielsweise das Gedicht abfragen möchten, das den hellen Mond im Inhalt enthält, können wir den folgenden Code eingeben:

# 创建一个检索器
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))

Das Ausgabeergebnis lautet wie folgt:

一共发现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": "海上生明月,天涯共此时。情人怨遥夜,竟夕起相思。灭烛怜光满,披衣觉露滋。不堪盈手赠,

Das obige ist der detaillierte Inhalt vonWhoosh: Ein leichtes Suchtool für Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:51cto.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen