Was ist Volltextsuche vs LIKE


133

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.

Antworten:


164

Im Allgemeinen gibt es einen Kompromiss zwischen "Präzision" und "Rückruf". Hohe Präzision bedeutet, dass weniger irrelevante Ergebnisse angezeigt werden (keine falsch positiven Ergebnisse), während ein hoher Rückruf bedeutet, dass weniger relevante Ergebnisse fehlen (keine falsch negativen Ergebnisse). Die Verwendung des LIKE-Operators bietet Ihnen 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 für die Volltextsuche verwenden einen "invertierten Index". Dies ist ein Index, in dem die Schlüssel einzelne Begriffe sind und die zugehörigen Werte Datensätze sind, die den Begriff enthalten. Die Volltextsuche ist optimiert, um den Schnittpunkt, die Vereinigung usw. dieser Datensatzgruppen zu berechnen, und bietet normalerweise einen Ranking-Algorithmus, um zu quantifizieren, wie stark ein bestimmter Datensatz mit Suchschlüsselwörtern ü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 verfügt das LIKE-Muster über führende Platzhalter, bei denen 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 Blocks unstrukturierten Textes in einzelne Wörter, Phrasen und spezielle Token
  • morphologische Analyse oder Stemming - Zusammenfallen von Variationen eines bestimmten Wortes zu einem Indexbegriff; B. "Mäuse" und "Maus" oder "Elektrifizierung" und "elektrisch" als dasselbe Wort behandeln
  • Ranking - Messung der Ähnlichkeit eines übereinstimmenden Datensatzes mit der Abfragezeichenfolge

2
Das Ranking wird in @ VipinJains Antwort
ychaouche

39

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


23

MySQL erstellt einen Index aus den Wörtern der aktivierten Volltextsuchspalte und führt Suchvorgänge für diesen Index durch. MySQL verwendet einen ausgeklügelten Algorithmus, um die mit der Suchabfrage übereinstimmenden Zeilen zu bestimmen.

Auch aus dieser SO Antwort :

Die Volltextsuche bietet einige Vorteile.

Indizierung:

Etwas wie:

WHERE Foo LIKE '%Bar';

Ein Index kann nicht genutzt werden. Es muss jede einzelne Zeile betrachten und prüfen, ob sie übereinstimmt. Ein Volltextindex kann dies jedoch. In der Tat können Volltextindizes viel mehr Flexibilität in Bezug auf die Reihenfolge der übereinstimmenden Wörter, die Nähe dieser Wörter usw. bieten.

Stemming:

Eine Volltextsuche kann Wörter enthalten. Wenn Sie nach Ausführen suchen, können Sie Ergebnisse für "Ausführen" oder "Ausführen" erhalten. Die meisten Volltext-Engines verfügen über Stammwörterbücher in verschiedenen Sprachen.

Gewichtete Ergebnisse:

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

Nachteile:

Ein Volltextindex kann möglicherweise riesig 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 berechnen zumindest zusätzliche Gebühren dafür. Als letztes habe ich beispielsweise ü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 im Vergleich zu Standardindizes zu Verzögerungen bei der Aktualisierung der Indizes kommen.


16

Like verwendet nur Platzhalter und ist nicht so 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 mich mit SQL CONTAINS () FREETEXT () und verwandten Volltextsuchelementen befassen, um ein besseres Verständnis der verfügbaren Elemente zu erhalten.


2
Ich empfehle jede Überprüfung sehr SOUNDEX
SOTN

11

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) angezeigt werden.

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

Nun kann die Term-Dokument-Matrix (welches Term-Mitglied in 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 "Alle Dokumente mit dem Wort / Begriff t1 abrufen" eingeht, wird der Dokumentensatz {d1, d5, d9,.. dn} zurückgegeben.

Sie können 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 Dokument-IDs.

Denken Sie daran, dass diese SQL-Abfrage mehr oder weniger O (1) -Leistung aufweist. 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 dem angegebenen Wort XYZ entsprechen:

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 Zeichenfolge linear zu scannen und alle übereinstimmenden Begriffe zu finden. Das Hinzufügen von Platzhaltern trägt zum Durcheinander bei. Es funktioniert hervorragend für kleine Saiten, wie Sie sich vorstellen können, wird aber bei längeren Sätzen kläglich scheitern. Und definitiv nicht vergleichbar, wenn Sie einen Absatz oder eine ganze Textseite usw. haben.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.