# Volltextsuche

HINWEIS

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

Traditionelle Datenbanktextsuchfunktionen mit Operatoren wie LIKE und ILIKE waren jahrelang grundlegend. Sie stoßen jedoch an ihre Grenzen, wenn es um die Anforderungen moderner Informationssuchsysteme geht, 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 von Tausenden von Ü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.

# Übersicht über das Tutorial

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 bitte unsere Schnellstartanleitung (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, sodass kein lokaler Download erforderlich ist.

Die folgende Tabelle gibt einen kurzen Überblick über den Inhalt dieses Datensatzes.

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 mit 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 Parameter unterstützen.

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

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

# Tokenizer simple, stem, whitespace

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 sollen. 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 Gibt an, 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 finden Sie unter cang-jie/options.rs (opens new window)
hmm boolean false Gibt an, ob HMM aktiviert werden soll

Oben wurde eine detaillierte Beschreibung der Parameter für die Tokenizer des MyScale FTS-Index 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 "gemeinnützige Institution 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 es.

SELECT
    id,
    title,
    body,
    TextSearch(body, 'gemeinnützige Institution 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 "gemeinnützige Institution 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, die komplexe natürliche Sprachabfragen unterstützt. Weitere Informationen finden Sie in der Dokumentation von Tantivy (opens new window).

Hier ist ein Beispiel für eine Abfrage 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 eines der Wörter "New York City", "African" oder "Paris" und erfüllt somit die Übereinstimmungsbedingung auf der rechten Seite der AND-Anweisung.

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

# Erklärung der TextSearch-Parameter

HINWEIS

Die Parameter sind nur in der DB-Version v1.6.3 oder höher verfügbar.

Nachfolgend finden Sie eine detaillierte Beschreibung der TextSearch()-Parameter:

Parameter Standardwert Mögliche Werte Beschreibung
enable_nlq true true, false Dieser Parameter legt fest, ob die Parsing natürlicher Sprachabfragen aktiviert werden soll. Wenn er auf true gesetzt ist, interpretiert FTS die Benutzereingabe als natürliche Sprachabfrage. Wenn er auf false gesetzt ist, verwendet FTS die Standardbegriffe-Abfrage zur Analyse der Benutzereingabe.
operator OR OR, AND Dieser Parameter gibt den logischen Operator an, der zum Kombinieren der einzelnen Abfragebegriffe (tokenisiert durch den Tokenizer) verwendet werden soll. Wenn OR ausgewählt wird, werden Ergebnisse zurückgegeben, die einer der Bedingungen entsprechen. Wenn AND ausgewählt wird, werden Ergebnisse zurückgegeben, die allen Bedingungen entsprechen.

# Beispielverwendung

SELECT
    id,
    title,
    body,
    TextSearch('enable_nlq=true', 'operator=OR')(body, 'mammoth AND Europe') AS score
FROM default.wiki_abstract_text
ORDER BY score DESC
LIMIT 5

Basierend auf den Ergebnissen enthält jede Zeile sowohl "mammoth" als auch "Europe", was der Logik der Aktivierung der natürlichen Sprachabfrage entspricht.

Bitte beachten Sie, dass es nur 2 Suchergebnisse gibt. Obwohl unsere SQL-Abfrage das Limit auf 5 gesetzt hat, erfüllen nur 2 Einträge in der Tabelle die Kriterien.

id title body score
3171491 Leymus racemosus Leymus racemosus is a species of perennial wild rye known by the common name mammoth wild rye. It is native to southeastern and eastern Europe, Middle Asia, Caucasus, Siberia, China, Mongolia, New Zealand, and parts of North America. 10.067189
2719784 Venus of Hohle Fels The Venus of Hohle Fels (also known as the Venus of Schelklingen; in German variously ) is an Upper Paleolithic Venus figurine made of mammoth ivory that was unearthed in 2008 in Hohle Fels, a cave near Schelklingen, Germany. It is dated to between 35,000 and 40,000 years ago, belonging to the early Aurignacian, at the very beginning of the Upper Paleolithic, which is associated with the earliest presence of Cro-Magnon in Europe. 6.9371195
SELECT
    id,
    title,
    body,
    TextSearch('enable_nlq=false', 'operator=OR')(body, 'Atlantic AND Europe') AS score
FROM default.wiki_abstract_text
ORDER BY score DESC
LIMIT 5

Nachdem die natürliche Sprachabfrage deaktiviert wurde, garantieren die Ergebnisse nicht mehr das gleichzeitige Auftreten von "Atlantic" und "Europe". Da der Standardwert des Operators OR ist, werden alle Zeilen in die Suchergebnisse aufgenommen, die "Atlantic", "AND" oder "Europe" enthalten.

id title body score
3046233 And And or AND may refer to: 13.748591
5050203 A N D (Tricot album) And}} 13.047318
357499 Andromeda I And 1}} 12.335348
678064 Omicron Andromedae And 1}} 12.335348
3716928 Platycheirus ramsaerensis Platycheirus ramsaerensis is a species of hoverfly. It is found along the parts of northern Europe that face the Atlantic. 11.937536

# 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. 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, indem Sie verschiedene Namen, Orte, Disziplinen und andere Begriffe kombinieren.

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. Durch die Anwendung dieser Techniken können Sie unstrukturierte Textdaten effizient verwalten und durchsuchen und die robusten Textverarbeitungsfunktionen von MyScale demonstrieren.

Last Updated: Sun Jun 30 2024 09:15:57 GMT+0000