# 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:
- Erstellen eines FTS-Index: Erfahren Sie, wie Sie FTS-Indizes für verschiedene Anwendungsfälle konfigurieren.
- Verwendung der Funktion
TextSearch()
: Entdecken Sie, wie Sie Texte mit BM25-Werten suchen und bewerten können. - Natürliche Sprachabfragen: Verbessern Sie die Suchlogik mit natürlichen Sprachverbindungen wie
AND
undOR
. - Zeichenketten-Suchfunktionen in MyScale: Erforschen Sie, wie MyScale FST-Indizes zur Verbesserung der Zeichenketten-Suchfunktionen verwendet.
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 |
# Tabellenfunktion full_text_search
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.