webentwicklung-frage-antwort-db.com.de

Was ist Volltextsuche vs LIKE

Ich habe gerade einen Beitrag gelesen, in dem "Volltextsuche" in SQL erwähnt wird.

Ich habe mich nur gefragt, was der Unterschied zwischen FTS und LIKE ist. Ich habe ein paar Artikel gelesen, konnte aber nichts finden, was es gut erklärt.

120
Nathan W

Im Allgemeinen gibt es einen Kompromiss zwischen "Präzision" und "Rückruf". Hohe Präzision bedeutet, dass weniger irrelevante Ergebnisse angezeigt werden (keine falschen Positiven), während ein hoher Rückruf bedeutet, dass weniger relevante Ergebnisse fehlen (keine falschen Negativen). Wenn Sie den LIKE-Operator verwenden, erhalten Sie 100% Präzision ohne Zugeständnisse für den Rückruf. Eine Volltextsuche bietet Ihnen viel Flexibilität, um die Genauigkeit für einen besseren Abruf zu verringern.

Die meisten Implementierungen der Volltextsuche verwenden einen "invertierten Index". Dies ist ein Index, in dem die Schlüssel einzelne Begriffe sind und die zugehörigen Werte Sätze von Datensätzen sind, die den Begriff enthalten. Die Volltextsuche ist für die Berechnung der Schnittmenge, Vereinigung usw. dieser Datensatzgruppen optimiert und bietet normalerweise einen Ranking-Algorithmus, mit dem quantifiziert werden kann, wie stark ein bestimmter Datensatz mit den Suchbegriffen übereinstimmt.

Der SQL LIKE-Operator kann äußerst ineffizient sein. Wenn Sie es auf eine nicht indizierte Spalte anwenden, wird ein vollständiger Scan verwendet, um Übereinstimmungen zu finden (genau wie bei jeder Abfrage in einem nicht indizierten Feld). Wenn die Spalte indiziert ist, kann der Abgleich mit Indexschlüsseln durchgeführt werden, jedoch mit weitaus geringerer Effizienz als bei den meisten Indexsuchen. Im schlimmsten Fall enthält das LIKE-Muster führende Platzhalter, für die jeder Indexschlüssel überprüft werden muss. Im Gegensatz dazu können viele Informationsabrufsysteme die Unterstützung führender Platzhalter ermöglichen, indem Suffixbäume in ausgewählten Feldern vorkompiliert werden.

Weitere für die Volltextsuche typische Funktionen sind:

  • lexikalische Analyse oder Tokenisierung - Aufteilen eines unstrukturierten Textblocks in einzelne Wörter, Phrasen und spezielle Token
  • morphologische Analyse oder Stemming - Zusammenfassen von Variationen eines bestimmten Wortes zu einem Indexbegriff; B. "Mäuse" und "Maus" oder "Elektrifizierung" und "Elektrizität" als dasselbe Wort behandeln
  • ranking - Messung der Ähnlichkeit eines übereinstimmenden Datensatzes mit der Abfragezeichenfolge
146
erickson

Bei FTS werden die einzelnen Wörter in einem Textfeld indiziert, um die Suche in vielen Datensätzen zu beschleunigen. Für die Verwendung von LIKE müssen Sie weiterhin eine Zeichenfolgensuche (linear oder ähnlich) innerhalb des Felds durchführen.

MySQL erstellt einen Index aus den Wörtern der aktivierten Volltextsuchspalte und durchsucht diesen Index. MySQL verwendet einen ausgeklügelten Algorithmus, um die mit der Suchabfrage übereinstimmenden Zeilen zu ermitteln.

Auch von diese SO Antwort :

Die Volltextsuche bietet einige Vorteile.

Indizierung:

So etwas wie:

WHERE Foo LIKE '%Bar';

Ein Index kann nicht ausgenutzt werden. Es muss jede einzelne Zeile betrachten und prüfen, ob sie übereinstimmt. Ein Volltextindex kann es jedoch. Tatsächlich können Volltextindizes eine viel größere Flexibilität hinsichtlich der Reihenfolge der übereinstimmenden Wörter, der Nähe dieser Wörter usw. bieten.

Stemming:

Eine Volltextsuche kann Wörter enthalten. Wenn Sie nach run suchen, können Sie Ergebnisse für "ran" oder "running" erhalten. Die meisten Volltext-Engines haben Stammwörterbücher in einer Vielzahl von Sprachen.

Gewichtete Ergebnisse:

Ein Volltextindex kann mehrere Spalten umfassen. Beispielsweise können Sie nach "Peach Pie" suchen und der Index kann einen Titel, Schlüsselwörter und einen Text enthalten. Ergebnisse, die mit dem Titel übereinstimmen, können als relevanter höher gewichtet und so sortiert werden, dass sie oben angezeigt werden.

Nachteile:

Ein Volltextindex kann möglicherweise sehr groß sein und um ein Vielfaches größer als ein Standard-B-TREE-Index. Aus diesem Grund deaktivieren viele gehostete Anbieter, die Datenbankinstanzen anbieten, diese Funktion oder verlangen zumindest eine zusätzliche Gebühr dafür. Zuletzt habe ich zum Beispiel überprüft, dass Windows Azure keine Volltextabfragen unterstützt.

Die Aktualisierung von Volltextindizes kann auch langsamer sein. Wenn sich die Daten stark ändern, kann es zu Verzögerungen bei der Aktualisierung der Indizes im Vergleich zu Standardindizes kommen.

17
Vipin Jain

Like verwendet nur Platzhalter und ist nicht allzu mächtig.

Volltext ermöglicht eine viel komplexere Suche, einschließlich And, Or, Not, sogar ähnlich klingender Ergebnisse (SOUNDEX) und vieler weiterer Elemente.

Ich würde anfangen, mich mit SQL CONTAINS () FREETEXT () und verwandten Volltextsuchelementen zu befassen, um ein besseres Verständnis der verfügbaren Informationen zu erhalten.

15
Mitchel Sellers

Der wirkliche Unterschied liegt in den Scanmethoden. Bei der Volltextsuche werden die Wörter (Begriffe) als Hash-Schlüssel verwendet, von denen jeder einem Array von Dokumenten zugeordnet ist, in denen die Schlüssel (Begriffe) vorkommen.

Document sets = {d1, d2, d3, d4, ... dn}
Term sets = {t1, t2, t3, .. tn}

Nun kann die Begriff-Dokument-Matrix (welcher Begriff gehört zu welchem ​​Dokument) wie folgt dargestellt werden:

t1 -> {d1, d5, d9,.. dn}
t2 -> {d11, d50, d2,.. dn}
t3 -> {d23, d67, d34,.. dn}
:
tn -> {d90, d87, d57,.. dn}

Wenn die Anfrage nach "Hol mir alle Dokumente, die das Wort/den Ausdruck t1 enthalten" eingeht, wird der Dokumentensatz {d1, d5, d9,.. dn} ist zurück gekommen.

Sie könnten ein de-normalisiertes Tabellenschema hacken, um Dokumente zu speichern - jede Zeile in der MySQL-Tabelle wird als "Dokument" betrachtet und eine TEXT-Spalte kann einen Absatz usw. enthalten. Der invertierte Index enthält die Begriffe als Hash-Schlüssel und die Zeilen-IDs als die Dokument-IDs.

Denken Sie daran, dass diese SQL-Abfrage mehr oder weniger O(1) Leistung hat. Die Abfrage ist unabhängig von

  1. Anzahl der Wörter/Begriffe in der Spalte TEXT
  2. Die Anzahl der Zeilen/Dokumente, die den Kriterien entsprechen
  3. Die Länge der Wörter/Begriffe

Zum Beispiel könnte diese SQL ausgelöst werden, um alle Zeilen zu extrahieren, die mit dem angegebenen Wort XYZ übereinstimmen:

SELECT * 
FROM   my_table 
WHERE  MATCH (my_text_column) against ('XYZ' IN boolean mode) ;

Vorsichtsmaßnahme: Wenn Sie dieser Abfrage ORDER BY hinzufügen, variieren Ihre Laufzeiten basierend auf den verschiedenen Parametern, von denen einer die Anzahl der übereinstimmenden Zeilen/Dokumente ist. Hüte dich.

Das LIKE hat jedoch nichts davon. Es ist gezwungen, den Satz/die Zeichenkette linear abzutasten und alle passenden Begriffe zu finden. Das Hinzufügen von Platzhaltern erhöht das Chaos. Wie Sie sich vorstellen können, eignet es sich hervorragend für Saiten mit geringer Länge, schlägt aber bei längeren Sätzen kläglich fehl. Und definitiv nicht vergleichbar, wenn man einen Absatz oder eine ganze Textseite etc. hat.

10
Kingz

FTS ist effizienter, leistungsfähiger (insbesondere für Wordbreaker und Stemming-Funktionen). Überprüfen Sie jedoch Ihre Anforderungen, da DBs manchmal nicht alle Sprachen unterstützen. MSSQL unterstützt beispielsweise kein Griechisch (siehe diese Seite http: //msdn.Microsoft.com/en-us/library/ms176076(v=sql.110).aspx )

3
kamskyleo