# Volltextsuche

HINWEIS

Dieser Leitfaden gilt nur für die DB-Version 1.5.0 oder höher.

Traditionelle Datenbank-Textsuchfunktionen mit Operatoren wie LIKE und ILIKE waren jahrelang grundlegend. Sie stoßen jedoch an ihre Grenzen, wenn es darum geht, die Anforderungen moderner Informationssuchsysteme zu erfüllen, aufgrund mehrerer Einschränkungen:

  • Fehlende sprachliche Unterstützung: Traditionelle Methoden haben Schwierigkeiten mit sprachlichen Nuancen und erkennen Wortableitungen (z.B. "satisfies" vs. "satisfy") nicht, was zu unvollständigen oder ungenauen Suchergebnissen führen kann. Obwohl es möglich ist, manuell nach Variationen mit OR zu suchen, ist dieser Ansatz umständlich und fehleranfällig.
  • Fehlende Ergebnisrangfolge: Ohne die Möglichkeit, Suchergebnisse zu sortieren, wird das Durchsuchen Tausender Übereinstimmungen ineffizient.
  • Leistungsprobleme: Das Fehlen von Indexunterstützung bedeutet, dass jedes Dokument für jede Suche verarbeitet werden muss, was zu langsamer Leistung führt.

Um diese Herausforderungen zu bewältigen, führt MyScale einen neuen Indextyp namens FTS-Index (Full-Text Search Index) ein, der von der Tantivy (opens new window)-Bibliothek unterstützt wird - einer leistungsstarken, Open-Source-Volltextsuchmaschinenbibliothek. Der FTS-Index unterstützt den BM25-Indexierungsalgorithmus, der effiziente und relevante Suchergebnisse ermöglicht. Diese Integration verbessert die Volltextsuchfunktion von MyScale und erhöht die Gesamtleistung.

# Tutorial-Übersicht

Dieses Tutorial führt Sie durch drei Arten von Suchexperimenten mit FTS-Indizes:

Illustration des FTS-Index in MyScale

Bevor Sie beginnen, stellen Sie sicher, dass Sie einen MyScale-Cluster eingerichtet haben. Für Anweisungen zur Einrichtung lesen Sie unseren Schnellstartleitfaden (opens new window).

# Übersicht über den Datensatz

Wir verwenden den Wikipedia-Abstract-Datensatz (opens new window), der über 5,6 Millionen Datensätze im Parquet-Format enthält. Dieser Datensatz wird direkt von S3 in MyScale importiert, ohne dass ein lokaler Download erforderlich ist.

Die folgende Tabelle beschreibt den Inhalt dieses Datensatzes kurz.

id body title url
... ... ... ...
77 Jake Rodkin is an American .... and Puzzle Agent. Jake Rodkin https://en.wikipedia.org/wiki/Jake_Rodkin (opens new window)
78 Friedlandpreis der Heimkehrer is ... of Germany. Friedlandpreis der Heimkehrer https://en.wikipedia.org/wiki/Friedlandpreis_der_Heimkehrer (opens new window)
... ... ... ...

# Erstellen und Befüllen der Tabelle

Erstellen Sie die Tabelle en_wiki_abstract in MyScale mit dem folgenden SQL-Befehl:

CREATE TABLE default.en_wiki_abstract(
    `id` UInt64,
    `body` String,
    `title` String,
    `url` String,
)
ENGINE = MergeTree
ORDER BY id;

Importieren Sie dann den Datensatz von S3. Bitte warten Sie geduldig, bis der Datenimport abgeschlossen ist.

INSERT INTO default.en_wiki_abstract SELECT * FROM s3('https://myscale-datasets.s3.ap-southeast-1.amazonaws.com/wiki_abstract_5m.parquet','Parquet');

Überprüfen Sie, ob die Tabelle 5.648.453 Datensätze enthält.

SELECT count(*) FROM default.en_wiki_abstract;

Ausgabe:

count()
5648453

Um die Suchleistung zu verbessern, können Sie die Tabelle optimieren, indem Sie sie in einen einzelnen Datenteil konsolidieren. Dieser Schritt ist optional.

OPTIMIZE TABLE default.en_wiki_abstract FINAL;

Führen Sie die folgende SQL-Anweisung aus, um zu überprüfen, ob die Daten in dieser Tabelle in einen Teil komprimiert wurden.

SELECT COUNT(*) FROM system.parts
WHERE table = 'en_wiki_abstract' AND active = 1;

Wenn die Daten auf 1 komprimiert sind, gibt diese SQL-Anweisung den folgenden Ergebnissatz zurück:

count()
1

# Verständnis der FTS-Indexparameter

MyScale unterstützt verschiedene Tokenizer, die jeweils für verschiedene Szenarien geeignet sind. Beim Erstellen eines FTS-Index können Sie ihn mit einer JSON-Konfiguration für den Tokenizer anpassen.

TIP

Bitte geben Sie einen gültigen JSON-String als Parameter für den FTS-Index an.

-- Beispiel 1: Erstellen eines Index ohne Angabe von Parametern, Verwendung der Standardkonfiguration
ALTER TABLE [table_name] ADD INDEX [index_name] [column_name]
TYPE fts;
-- Beispiel 2: Erstellen eines Index mit dem Standard-Tokenizer
ALTER TABLE [table_name] ADD INDEX [index_name] [column_name]
TYPE fts('{"[column_name]":{"tokenizer":{"type":"default"}}}');
-- Beispiel 3: Verwendung des Stem-Tokenizer und Anwendung von Stoppwörtern
ALTER TABLE [table_name] ADD INDEX [index_name] [column_name]
TYPE fts('{"[column_name]":{"tokenizer":{"type":"stem", "stop_word_filters":["english"]}}}');

In der folgenden Tabelle sind die Arten von Tokenizern aufgeführt, die vom FTS-Index unterstützt werden.

Art des Tokenizers Beschreibung
default Standard-Tokenizer, teilt Text anhand von nicht-alphabetischen Zeichen auf, Groß-/Kleinschreibung wird nicht beachtet
raw Raw-Tokenizer, führt keine Tokenisierung des Textes durch, behandelt den gesamten Text als einzelnes Token
simple Einfacher Tokenizer, teilt Text anhand von nicht-alphabetischen Zeichen auf
stem Stemming-Tokenizer, unterstützt mehrere Sprachen, wandelt Wörter in ihre Stammform um, kann Wortformen ignorieren
whitespace Whitespace-Tokenizer, teilt Text anhand von Leerzeichen (Leerzeichen, Tabs, Zeilenumbrüche usw.) auf
ngram N-Gram-Tokenizer, teilt Text basierend auf der angegebenen n-gram-Länge auf
chinese Chinesischer Tokenizer, führt Tokenisierung auf chinesischem Text durch, verwendet intern die Tokenisierungsbibliothek jieba

# Gemeinsame Tokenizer-Parameter

Die Tokenizer raw und stem unterstützen nur den Parameter store_doc, während die anderen Tokenizer zusätzlich zu den oben genannten gemeinsamen Parametern weitere gemeinsame Parameter unterstützen.

Parametername Typ Standardwert Beschreibung
store_doc boolean false Ob das ursprüngliche Dokument gespeichert werden soll, derzeit nicht empfohlen, dies zu aktivieren
length_limit number 40 Maximale Länge der tokenisierten Tokens
case_sensitive boolean false Ob die Tokenisierung die Groß-/Kleinschreibung beachtet

Die meisten Tokenizer unterstützen zusätzlich zu den oben genannten gemeinsamen Parametern weitere spezifische Parameter.

# Tokenizer simplestemwhitespace

Parametername Typ Standardwert Beschreibung
stop_word_filters string[] [] Stoppwortfilter, gibt an, welche Sprachen Stoppwörter während der Tokenisierung verwerfen sollen, alle gültigen Sprachen sind ["danish", "dutch", "english", "finnish", "french", "german", "hungarian", "italian", "norwegian", "portuguese", "russian", "spanish", "swedish"]

# Tokenizer stem

Parametername Typ Standardwert Beschreibung
stem_languages string[] [] Sprachen, die für das Stemming verwendet werden, für Englisch kann es bei der Tokenisierung Wortformen ignorieren, unterstützte Sprachen für den Stem-Tokenizer sind ["arabic", "danish", "dutch", "english", "finnish", "french", "german", "greek", "hungarian", "italian", "norwegian", "portuguese", "romanian", "russian", "spanish", "swedish", "tamil", "turkish"]

# Tokenizer ngram

Parametername Typ Standardwert Beschreibung
min_gram number 2 Mindestanzahl von n-Grammen
max_gram number 3 Maximale Anzahl von n-Grammen
prefix_only boolean false Ob nur n-Gramme aus dem Präfix von Wörtern extrahiert werden sollen

# Tokenizer chinese

Für den chinesischen Tokenizer wird cang-jie (opens new window) als zugrunde liegende Implementierung verwendet.

Parametername Typ Standardwert Beschreibung
jieba string "default" "default" bedeutet die Verwendung des jieba-Wörterbuchs, "empty" bedeutet die Nichtverwendung des integrierten jieba-Wörterbuchs für die Tokenisierung. Gültige Werte sind "default" oder "empty"
mode string "search" Chinesischer Tokenisierungsmodus, gültige Werte sind "all", "default", "search" oder "unicode", die Unterschiede zwischen den einzelnen Modi können unter cang-jie/options.rs (opens new window) nachgelesen werden
hmm boolean false Ob HMM aktiviert werden soll

Oben wurde eine detaillierte Beschreibung der Parameter für die MyScale FTS-Index-Tokenizer gegeben. Beim Erstellen eines FTS-Index können Sie den Tokenizer-Typ auswählen, der Ihren Anforderungen am besten entspricht, und seine Parameter konfigurieren, um die Suchleistung und -ergebnisse zu verbessern.

# Erstellen eines FTS-Index

Passen Sie Ihren FTS-Index mit dem entsprechenden Tokenizer an, um die Suchleistung zu optimieren. Verwenden Sie beispielsweise den stem-Tokenizer mit englischen Stoppwörtern, um die Suchgenauigkeit zu verbessern, indem Sie sich auf die Grundform von Wörtern konzentrieren.

ALTER TABLE default.en_wiki_abstract
ADD INDEX body_idx (body)
TYPE fts('{"body":{"tokenizer":{"type":"stem", "stop_word_filters":["english"]}}}');

Normalerweise werden FTS-Indizes (ähnlich wie Skip-Indizes in ClickHouse) nur auf neu eingefügte Daten angewendet, sodass das Hinzufügen des Indexes keine Auswirkungen auf vorhandene Daten hat. Um bereits vorhandene Daten zu indizieren, verwenden Sie diese Anweisung:

ALTER TABLE default.en_wiki_abstract MATERIALIZE INDEX body_idx;

# Suche mit der BM25-Rangfolge des Dokuments

Hinweis

Die erste Ausführung von TextSearch() kann langsamer sein, da der FTS-Index geladen werden muss.

Das folgende Beispiel zeigt, wie die Funktion TextSearch() verwendet wird. Das Beispiel liefert die 10 relevantesten Dokumente zu "non-profit institute in Washington". Das Maß für die Relevanz ist der BM25-Wert, der von der Funktion TextSearch() zurückgegeben wird - je höher der Wert, desto relevanter ist er.

SELECT
    id,
    title,
    body,
    TextSearch(body, 'non-profit institute in Washington') AS score
FROM default.en_wiki_abstract
ORDER BY score DESC
LIMIT 5;

Aus den Ergebnissen können wir sehen, dass der Text in jeder Zeile der Spalte "body" mit dem Suchbegriff "non-profit institute in Washington" zusammenhängt.

id title body score
3400768 Drug Strategies Drug Strategies is a non-profit research institute located in Washington D.C. 24.457561
872513 Earth Policy Institute Earth Policy Institute was an independent non-profit environmental organization based in Washington, D.C. 22.730673
895248 Arab American Institute Founded in 1985, the Arab American Institute is a non-profit membership organization based in Washington D.C. 21.955559
1950599 Environmental Law Institute The Environmental Law Institute (ELI) is a non-profit, non-partisan organization, headquartered in Washington, D.C. 21.231567
2351478 Public Knowledge Public Knowledge is a non-profit Washington, D.C. 20.742344

# Nutzung von natürlichen Sprachabfragen

MyScale verwendet die Tantivy-Bibliothek für die Volltextsuche (FTS)-Indizierung, was komplexe natürliche Sprachabfragen ermöglicht. Weitere Informationen finden Sie in der offiziellen Dokumentation (opens new window).

Hier ist ein Beispiel für eine Kombinationsabfrage mit mehreren Bedingungen unter Verwendung von AND und OR. Wir möchten nach anthropologischen Themen suchen, die mit New York City, Afrika oder Paris zusammenhängen. Die SQL-Abfrage lautet:

SELECT
    id,
    title,
    body,
    TextSearch(body, 'Anthropological AND ("New York City" OR African OR Paris)') AS score
FROM default.en_wiki_abstract
ORDER BY score DESC
LIMIT 5;

Die Suchergebnisse zeigen, dass jede Textzeile das Wort "Anthropological" (Groß-/Kleinschreibung wird nicht beachtet) enthält und die Bedingung auf der linken Seite der AND-Anweisung erfüllt. Gleichzeitig enthält jedes Ergebnis mindestens eine der folgenden Bedingungen: "New York City", "African" oder "Paris", was der Übereinstimmungsbedingung auf der rechten Seite der AND-Anweisung entspricht.

id title body score
2826913 African Anthropologist African Anthropologist is the journal of the Pan African Anthropological Association (PAAA). 20.131313
3905943 Tunnel People Tunnel People is an anthropological-journalistic account describing an underground homeless community in New York City. It is written by war photographer and anthropologist Teun Voeten and was published by PM Press in 2010. 13.759308
3790627 Les Accords de Bella Les Accords de Bella is a 2007 anthropological documentary film directed by David Constantin. It was selected by the African Film Festival of Cordoba - FCAT. 12.769518
4488199 Naparay Naparay, in African anthropological study, is a non-linear conception of human life held by some West African peoples such as the Yoruba. Similar to reincarnation, naparay holds that lives are cyclic and attributes of previous lives may carry over to a new life. 11.682068
1725559 Gradhiva Gradhiva is an anthropological and museological journal, founded in 1986 by the poet and social scientist Michel Leiris and by the anthropologist Jean Jamin. It is since 2005 published by the Musée du Quai Branly in Paris. 11.135916

# Nutzung von SkipIndex zur Suche in Zeichenketten

Wenn Sie die folgenden integrierten ClickHouse-Funktionen für Zeichensuchvorgänge verwenden, werden sie alle durch den FTS-Index gefiltert: equals, notEquals, like, notLike, hasToken, hasTokenOrNull, in, notIn,startsWith,endsWith,has,mapContains,multiSearchAny.

Beispiel - 1 Führen Sie eine einfache Schlüsselwortsuche durch, z.B. die Suche nach dem einzelnen Wort 'Tsinghua'.

SELECT count(*)
FROM default.en_wiki_abstract
WHERE hasToken(body, 'Tsinghua');

Ausgabe:

count()
81

Beispiel - 2 Führen Sie eine Mehrfachschlüsselwortsuche durch, um Artikel zu finden, die Eiffelturm, aber nicht Paris enthalten.

SELECT count(*)
FROM default.en_wiki_abstract
WHERE (NOT hasToken(body, 'Paris')) AND multiSearchAny(body, ['Eiffel', 'Tower'])

Ausgabe:

count()
2828

Beispiel - 3 Führen Sie eine komplexe bedingte Kombinationsabfrage durch, in der verschiedene Namen, Orte, Disziplinen und andere Begriffe kombiniert werden.

SELECT count(*)
FROM default.en_wiki_abstract
WHERE (NOT multiSearchAny(body, ['Montessori', 'postulated', 'Rooney'])) AND (hasToken(body, 'Patsy') OR hasToken(body, 'Anthropological'))

Ausgabe:

count()
204

# Fazit

Dieser Leitfaden hat Ihnen gezeigt, wie Sie MyScale für erweiterte Textsuchfunktionen nutzen können, vom Einrichten von FTS-Indizes bis zur Ausführung von natürlichen Sprachabfragen. Mit diesen Techniken können Sie unstrukturierte Textdaten effizient verwalten und durchsuchen und die robusten Textverarbeitungsfunktionen von MyScale demonstrieren.

Last Updated: Mon Apr 29 2024 08:06:28 GMT+0000