# 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 unterschiedliche Szenarien geeignet sind. Beim Erstellen eines FTS-Indexes können Sie ihn mit einer JSON-Konfiguration für den Tokenizer anpassen.

TIP

Bitte geben Sie eine gültige JSON-Zeichenfolge im Parameter des FTS-Indexes an.

-- Beispiel 1: Erstellen eines Indexes für eine einzelne Textspalte mit dem Standard-Tokenizer, ohne zusätzliche Parameter anzugeben.
ALTER TABLE [table_name] ADD INDEX [index_name] [column_name]
TYPE fts;
-- Beispiel 2: Erstellen eines Indexes für eine einzelne Textspalte mit explizit definiertem Standard-Tokenizer.
ALTER TABLE [table_name] ADD INDEX [index_name] [column_name]
TYPE fts('{"<column_name>":{"tokenizer":{"type":"default"}}}');
-- Beispiel 3: Erstellen eines Indexes für eine einzelne Textspalte unter Verwendung des ICU-Tokenizers.
ALTER TABLE [table_name] ADD INDEX [index_name] [column_name]
TYPE fts('{"<column_name>":{"tokenizer":{"type":"icu"}}}');
-- Beispiel 4: Erstellen eines Indexes unter Verwendung des Stem-Tokenizers und Anwenden von Stop-Wörtern zur Filterung.
ALTER TABLE [table_name] ADD INDEX [index_name] [column_name]
TYPE fts('{"<column_name>":{"tokenizer":{"type":"stem", "stop_word_filters":["english"]}}}');
-- Beispiel 5: Erstellen eines Indexes für mehrere Textspalten; jede Spalte verwendet standardmäßig den Standard-Tokenizer.
ALTER TABLE [table_name] ADD INDEX [index_name] ([column_name_0], [column_name_1], ...)
TYPE fts;
-- Beispiel 6: Unterschiedliche Tokenizer-Typen für jede Textspalte im Index angeben.
ALTER TABLE [table_name] ADD INDEX [index_name] ([column_name_0], [column_name_1], ...)
TYPE fts('{"<column_name_0>":{"tokenizer":{"type":"icu"}}, "<column_name_1>":{"tokenizer":{"type":"whitespace"}}}');

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
icu Der ICU-Tokenizer ist hervorragend im Umgang mit mehrsprachigem Text. Wenn Sie Schwierigkeiten beim Tokenisieren von Texten in mehreren Sprachen haben, ist der ICU-Tokenizer Ihre ultimative Lösung.

# Gemeinsame Tokenizer-Parameter

Die Tokenizer default und raw 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, icu

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, icu

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

# icu Tokenizer

Parametername Typ Standardwert Beschreibung
mode Zeichenkette "word" Gültige Werte sind "word", "sentence", "line", "grapheme", "word". Der "word"-Modus funktioniert am besten in mehrsprachigen Kontexten.

Weitere Informationen zu den Funktionen des ICU-Tokenizers finden Sie unter icu_segmenter (opens new window)

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- (Volltextsuche) Index mit dem entsprechenden Tokenizer an, um die Suchleistung zu optimieren. Zum Beispiel kann die Verwendung des stem Tokenizers mit englischen Stoppwörtern die Suchgenauigkeit verbessern, indem sie sich auf die Grundformen der Wörter konzentriert.

Einspaltige und mehrspaltige Indizes spielen eine entscheidende Rolle bei der Textsuche. Einspaltige Indizes ermöglichen effiziente Suchvorgänge innerhalb eines bestimmten Feldes, während mehrspaltige Indizes umfassende Suchvorgänge über mehrere Felder hinweg ermöglichen, was die gesamte Suchleistung verbessert. Um Textsuchen in einem einspaltigen Index durchzuführen, können Sie die Funktion TextSearch verwenden. Für mehrspaltige Indizes ermöglicht die Funktion full_text_search effektive Suchen in allen indizierten Spalten.

# Erstellen eines einspaltigen Textindexes

Um einen einspaltigen Textindex zu erstellen, verwenden Sie die folgende SQL-Anweisung:

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

In diesem Beispiel erstellen wir einen FTS-Index in der Spalte "body". Beachten Sie, dass FTS-Indizes (ähnlich wie Skip-Indizes in ClickHouse) nur auf neu eingefügte Daten angewendet werden. Das bloße Hinzufügen des Indexes wirkt sich daher nicht auf vorhandene Daten aus. Um bereits vorhandene Datensätze zu indizieren, führen Sie die folgende Anweisung aus:

ALTER TABLE default.en_wiki_abstract MATERIALIZE INDEX body_idx;

# Erstellen eines mehrspaltigen Textindexes

Sie können auch einen Index für mehrere Textspalten erstellen, um die Suchmöglichkeiten in verschiedenen Feldern zu verbessern. Zum Beispiel:

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

In diesem Fall definieren wir einen FTS-Index sowohl für die Spalten "body" als auch "title" und verwenden für jede Spalte unterschiedliche Tokenizer. Natürlich müssen Sie auch die MATERIALIZE-Anweisung ausführen, genau wie beim Erstellen eines einspaltigen Index:

ALTER TABLE default.en_wiki_abstract MATERIALIZE INDEX multi_col_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

Ab der DB-Version v1.8 oder höher kann die Funktion TextSearch() mithilfe eines Mehrspalten-FTS-Index in einer Textspalte suchen. Die Verwendung ist die gleiche wie oben für einen einzelnen Spalten-FTS-Index.

# 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.

NOTE

TextSearch für verteilte Tabellen ist nur in der Datenbankversion v1.7.0 oder höher verfügbar. Für TextSearch auf verteilten Tabellen reicht es aus, den entsprechenden FTS-Index auf den lokalen Tabellen zu erstellen.

Unten finden Sie eine detaillierte Beschreibung der TextSearch() Abfrageeinstellungen:

Settings Default Value Candidate Values Description
dfs_query_then_fetch false true, false Für verteilte Tabellen entscheidet diese Einstellung, ob zunächst eine verteilte Abfrage durchgeführt wird, um Statistiken von allen Shards zu sammeln, gefolgt von einer präzisen Volltextsuche (FTS) basierend auf den gesammelten Statistiken.

# 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

Note

Die Tabellenfunktion full_text_search() ist nur in der DB-Version v1.7.0 oder höher verfügbar.

Die Tabellenfunktion full_text_search() wird verwendet, um Textsuchen in einem FTS-Index mit mehreren Textspalten in MyScale durchzuführen. Die grundlegende Syntax für die full_text_search() Tabellenfunktion ist wie folgt:

full_text_search(table_name, index_name, query [,with_score] [,enable_nlq] [,operator])
  • table_name bezieht sich auf die Tabelle, die den FTS-Index enthält.
  • index_name bezieht sich auf den FTS-Index, der mehrere zu durchsuchende Textspalten enthält.
  • query bezieht sich auf die Suchzeichenfolge, die der Tantivy-Abfragesprache entspricht.
  • with_score gibt an, ob die bm25-Score-Spalte zurückgegeben werden soll (Standardwert 0).
  • enable_nlq gibt an, ob das Parsen natürlicher Sprachabfragen aktiviert werden soll (Standardwert 1).
  • operator gibt den logischen Operator an, der zum Kombinieren der einzelnen Suchbegriffe (tokenisiert durch den Tokenizer) verwendet wird (Standardwert 'OR').

Das folgende Beispiel zeigt, wie die full_text_search() Funktion verwendet wird. Das Beispiel gibt die fünf relevantesten Dokumente zurück, bei denen die Spalte body "non-profit institute in Washington" enthält oder die Spalte title "Institute" enthält. Der Relevanzmesswert ist der BM25-Score, der von der full_text_search() Funktion zurückgegeben wird - je höher der Score, desto relevanter ist das Dokument.

SELECT
    id,
    title,
    body,
    bm25_score
FROM full_text_search('default.en_wiki_abstract', 'multi_col_idx', 'body:non-profit institute in Washington or title:Institute', 1)
ORDER BY bm25_score DESC
LIMIT 5;

Anhand der Ergebnisse können wir sehen, dass entweder der Text in jeder Zeile der body-Spalte mit dem Suchbegriff "non-profit institute in Washington" oder der Text in der title-Spalte mit dem Suchbegriff "Institute" in Verbindung steht.

id title body bm25_score
849009 Washington Institute Washington Institute may mean 38.110603
872513 Earth Policy Institute Earth Policy Institute was an independent non-profit environmental organization based in Washington, D.C. 35.545998
895248 Arab American Institute Founded in 1985, the Arab American Institute is a non-profit membership organization based in Washington D.C. 34.77088
1730029 Washington Cancer Institute The Washington Cancer Institute (WCI) is Washington, D.C. 34.445385
1950599 Environmental Law Institute The Environmental Law Institute (ELI) is a non-profit, non-partisan organization, headquartered in Washington, D.C. 34.046894

# Beschleunigung eingebauter Zeichenfolgenfunktionen

FTS-Indizes können auch verwendet werden, um die eingebauten Zeichenfolgenfunktionen von ClickHouse zu beschleunigen, einschließlich equals, notEquals, like, notLike, hasToken, hasTokenOrNull, in, notIn, startsWith, endsWith, has, mapContains und multiSearchAny.

Um zu steuern, ob der FTS-Index beim Ausführen dieser Zeichenfolgenfunktionen aktiviert ist, wird eine Abfrageeinstellung namens enable_fts_index_for_string_functions bereitgestellt. Der Standardwert ist 0, was bedeutet, dass der FTS-Index beim Ausführen dieser eingebauten ClickHouse-Funktionen nicht verwendet wird. Benutzer können ihn manuell auf 1 setzen, um FTS zu aktivieren. Weitere Informationen zur Verwendung von Abfrageeinstellungen finden Sie in den ClickHouse Query-level Settings (opens new window).

# Warum ist der Standardwert von enable_fts_index_for_string_functions auf 0 gesetzt?

Effizienzüberlegungen:

Wenn die gesuchte Zeichenfolge in der gesamten Tabelle relativ selten vorkommt, kann die Verwendung von FTS eine erhebliche Beschleunigung bewirken. Wenn die gesuchte Zeichenfolge jedoch sehr häufig in der Tabelle vorkommt, wie gängige Wörter wie What, his usw., kann die Verwendung von FTS-Indizes in diesem Fall die Abfragegeschwindigkeit regulärer Funktionen tatsächlich verlangsamen, da die meisten Granulate gelesen werden müssen.

Genauigkeit der Suchergebnisse:

FTS-Indizes tokenisieren den Text in der Tabelle, und das Verhalten der Tokenisierung variiert je nach Typ des Tokenizers. Zum Beispiel behandelt der raw-Tokenizer den Originaltext als ein einzelnes Token, während der whitespace-Tokenizer den Originaltext basierend auf Leerzeichen in mehrere Tokens aufteilt. Nachfolgend sind die Tokenisierungsergebnisse dieser beiden Tokenizer für "WhiteHouse is very beautiful." aufgeführt:

  • tokenizer(raw): token<"WhiteHouse is very beautiful.">
  • tokenizer(whitespace): token<"WhiteHouse">, token<"is">, token<"very">, token<"beautiful">

Das Verhalten des Tokenizers kann die Genauigkeit der Zeichenfolgenabgleichsfunktionen beeinflussen. Beim Verwenden des raw-Tokenizers wandelt FTS eine like-Abfrage %WhiteHouse%beautiful% in eine RegexQuery in Tantivy um und durchsucht alle Tokens. Es ist klar, dass wir token<"WhiteHouse is very beautiful."> korrekt übereinstimmen können.

Beim Verwenden des whitespace-Tokenizers wandelt FTS eine like-Abfrage %WhiteHouse%beautiful% in einen Regex-Abgleich um und stellt fest, dass keines der vorhandenen Tokens übereinstimmt, wodurch das Textsegment nicht als Treffer markiert werden kann, was zu ungenauen Suchergebnissen führt.

Daher können bei Zeichenfolgenfunktionen, die in RegexQuery umgewandelt werden, einschließlich like, notLike, startsWith und endsWith, nur der raw-Tokenizer bei auf 1 gesetztem enable_fts_index_for_string_functions korrekte Ergebnisse liefern.

# Anwendungsbeispiele

Beispiel 1: Einfache Stichwortsuche durchführen

Suche nach dem einzelnen Wort 'Tsinghua'.

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

Ausgabe:

count()
81

Beispiel 2: Mehrfachstichwortsuche durchführen

Finde Artikel, die "Eiffel Tower" enthalten, aber nicht "Paris".

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

Ausgabe:

count()
2828

Beispiel 3: Komplexe bedingte Kombinationsabfrage durchführen

Kombiniere verschiedene Namen, Orte, Disziplinen und andere Begriffe.

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

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: Fri Nov 01 2024 09:02:06 GMT+0000