Frage

Ich habe gerade gelesen einen Beitrag „Volltextsuche“ in SQL zu erwähnen.

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

War es hilfreich?

Lösung

In der Regel gibt es einen Kompromiss zwischen „Präzision“ und „Rückruf“. Hohe Präzision bedeutet, dass weniger irrelevante Ergebnisse sind (keine False Positives), während eine hohe Rückruf bedeutet, dass weniger relevante Ergebnisse fehlen (keine falsch-negative Ergebnisse). Mit dem LIKE-Operator gibt Ihnen 100% Präzision ohne Zugeständnisse für Rückruf. Eine Volltextsuche gibt Ihnen viel Flexibilität zu stimmen auf der Präzision für besseren Rückruf.

Die meisten Volltextsuche Implementierungen verwenden einen „invertierten Index“. Dies ist ein Index, bei dem die Tasten sind einzelne Formulierungen, und die zugehörigen Werte sind Sätze von Datensätzen, die das Wort enthalten. Volltextsuche wird optimiert, um die Kreuzung zu berechnen, Vereinigung usw. dieser Datensätze und stellt in der Regel einen Ranking-Algorithmus zu quantifizieren, wie stark ein bestimmter Datensatz Suchbegriffen entsprechen.

Die SQL-LIKE-Operator kann sehr ineffizient sein. Wenn Sie es zu einer nicht indizierten Spalte anwenden, wird ein Scan verwendet werden Übereinstimmungen zu finden (wie jede Abfrage auf einer nicht indizierten Feld). Wenn die Spalte indiziert ist, kann Abgleich mit Indexschlüssel durchgeführt werden, aber mit weit weniger Effizienz als die meist Index-Lookups. Im schlimmsten Fall wird die LIKE Muster führende Platzhalter haben, die jeden Indexschlüssel benötigen geprüft werden. Im Gegensatz dazu können viele Information Retrieval-Systeme unterstützen ermöglichen für Platzhalter durch vorge Kompilieren Suffix Bäume in ausgewählten Feldern führt.

Weitere Merkmale typisch für die Volltextsuche ist

  • lexikalische Analyse oder tokenization brech ein Block von unstrukturierten Text einzelne Wörter, Phrasen und spezielle Token
  • morphologische Variationen Analyse oder stamm kollabierende ein gegebenes Wort in einen Index Term; zum Beispiel „Mäuse“ behandeln und „Maus“ oder „Elektrifizierung“ und "Electric", wie das gleiche Wort
  • ranking-Messung der Ähnlichkeit eines passenden Datensatz zu die Abfrage-Zeichenfolge

Andere Tipps

FTS beinhaltet Indizierung der einzelnen Wörter in einem Textfeld, um eine schnelle Suche durch viele Datensätze zu machen. LIKE erfordert, dass Sie immer noch eine String-Suche (linear oder dergleichen) innerhalb des Feldes.

zu tun

MySQL erstellt einen Index aus den Worten des Volltextsuche Spalte aktiviert und führt sucht auf diesem Index. MySQL verwendet einen ausgeklügelten Algorithmus die Zeilen abgestimmt gegen die Suchabfrage zu bestimmen.

Auch von diese SO beantworten :

  

Es gibt ein paar Vorteile zu Volltextsuche.

     

Indexing:

     

So etwas wie:

WHERE Foo LIKE '%Bar';
     

Kann nicht die Vorteile eines Index nehmen. Es hat in jeder einzelnen Zeile zu sehen, und sehen, ob sie paßt. Ein Volltextindex, jedoch kann. In der Tat können Volltextindizes viel mehr Flexibilität in Bezug auf die Reihenfolge der passenden Worte bieten, wie nah diese Worte zusammen, etc.

     

Stimmung:

     

Eine Volltextsuche können Wörter stammen. Wenn Sie laufen, sie können die Ergebnisse für „ran“ get oder „Laufen“. Die meisten Volltext-Motoren haben Wörterbücher in einer Vielzahl von Sprachen stammen.

     

Die gewichteten Ergebnisse:

     

Ein Volltextindex kann mehrere Spalten umfassen. Zum Beispiel können Sie für „Pfirsich-Torte“ suchen, und der Index kann einen Titel, Keywords und einen Körper umfassen. Ergebnisse, die den Titel entsprechen höher gewichtet, als relevanter werden können und in der Nähe der Spitze zu zeigen, sortiert werden.

     

Nachteile:

     

Ein Volltext-Index kann potenziell sehr groß sein, Index ein Vielfaches größer als ein Standard-B-Baum. Aus diesem Grund Anbieter viele gehostet, die Datenbankinstanzen bieten diese Funktion deaktivieren möchten, oder zumindest dafür extra bezahlen. Zum Beispiel zuletzt geprüft ich habe Windows Azure nicht Volltext-Abfragen unterstützen.

     

Volltext-Indizes kann auch langsamer zu aktualisieren sein. Wenn die Daten viel ändert, könnte es einige Verzögerung sein Indizes im Vergleich zu Standard-Indizes zu aktualisieren.

Wie verwendet Platzhalter nur ist und nicht so mächtig.

Volltext erlaubt wesentlich komplexere Suche, einschließlich und, oder, nicht, auch ähnlich klingende Ergebnisse (SOUNDEX) und viele weitere Artikel.

Ich würde beginnen an der SQL suche contains () FREETEXT- () und die damit verbundene Volltextsuche Produkte zu helfen, ein besseres Verständnis von dem, was verfügbar ist.

Der wirkliche Unterschied ist die Scanmethoden. Für die Volltextsuche werden die Wörter (Begriffe) als Hash-Schlüssel verwendet - von denen jeder mit einer Reihe von Dokumenten, die Schlüssel (Begriffe) erscheint in assoziiert Es ist wie folgt:.

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

Jetzt Begriff-Dokument-Matrix (dieser Begriff Mitglied in dem Dokument) kann 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 Anforderung zu fragen, kommt für „Geben Sie mir alle Dokumente das Wort / Begriff t1 enthalten.“ - dann wird das Dokument gesetzt {d1, d5, d9,.. dn} zurückgegeben

Sie könnten ein de-normalisierte Tabellenschema zu speichern Dokumente hacken - jede Zeile in MySQL-Tabelle wird als „Dokument“ und eine Textspalte in Betracht gezogen werden, um einen Absatz usw. Der invertierte Index enthält die Begriffe als Hash-Schlüssel enthalten und die row-IDs wie das Dokumenten-IDs.

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

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

Zum Beispiel diese SQL abgefeuert werden konnten alle Zeilen zu extrahieren das gegebene Wort XYZ passende:

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

Caveat: Wenn Sie fügen Von sortieren diese Abfrage, wird Ihr Runtimes auf die verschiedenen Parameter variieren, von denen die Anzahl der passenden Zeilen / Dokumente. Hüte dich.

Die LIKE aber hat nichts davon. Es wird gezwungen linear den Satz / string zu scannen und alle passenden Begriffe zu finden. Wild Card fügt das Chaos hinzufügen. Es funktioniert gut für kleine Zeichenfolgen, wie Sie sich vorstellen können, wird aber kläglich für längere Sätze scheitern. Und auf jeden Fall nicht vergleichbar, wenn mit einem Absatz oder eine ganze Seite Text usw.

FTS ist effizienter, leistungsstark (vor allem für Word Breakers und ergeben Funktionalitäten)  ... aber Ihre Anforderungen überprüfen, weil manchmal DBs zum Beispiel nicht alle Sprachen unterstützt MSSQL Griechisch nicht unterstützt (überprüft auf dieser Seite http://msdn.microsoft.com/en-us/library/ms176076 (v = sql.110) aspx )

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top