2009-01-25 4 views
29

Angenommen, ich habe eine ziemlich einfache App, mit der Benutzer Informationen auf DVDs speichern können (Titel, Schauspieler, Jahr, Beschreibung, etc.) und ich möchte Benutzern erlauben, ihre Sammlung zu durchsuchen durch irgendeines dieser Felder (zB "Keanu Reeves" oder "The Matrix" wären gültige Suchanfragen).SQL-Volltextsuche vs "LIKE"

Welchen Vorteil hat die SQL-Volltextsuche, wenn Sie die Abfrage einfach um Leerzeichen aufteilen und einige "LIKE" -Klauseln in der SQL-Anweisung ausführen? Läuft es einfach besser oder liefert es tatsächlich genauere Ergebnisse?

Antwort

27

Volltextsuche ist wahrscheinlich schneller, da es von einem Index von Wörtern profitiert, die es verwenden wird, um die Datensätze zu suchen, während die Verwendung von LIKE zum vollständigen Tabellenscan benötigt wird.

In einigen Fällen wird LIKE genauer, da LIKE "% The%" UND LIKE "% Matrix" "Matrix" auswählen, aber nicht "Matrix Reloaded", während die Volltextsuche "The" ignoriert und beide zurückgibt. Das heißt, beide wären wahrscheinlich ein besseres Ergebnis gewesen.

+0

Können wir keinen Index für Zeichen [Muster] erstellen (https://www.postgresql.org/docs/9.5/static/indexes-opclass.html)? – overexchange

3

Es wird besser funktionieren, aber wenn Sie nicht viele Daten haben, werden Sie diesen Unterschied nicht bemerken. Mit einem SQL-Volltextsuchindex können Sie Operatoren verwenden, die weiter fortgeschritten sind als eine einfache "LIKE" -Operation. Wenn Sie jedoch nur eine LIKE-Operation für Ihren Volltextindex verwenden, sind die Ergebnisse identisch.

0

Stellen Sie sich vor, Sie können Notizen/Beschreibungen auf DVDs eingeben. In diesem Fall ist es gut zu erlauben, nach Beschreibungen zu suchen. Volltextsuche in diesem Fall wird es besser machen.

9

Volltextindizes (die Indizes sind) sind viel schneller als die Verwendung von LIKE (die im Wesentlichen jede Zeile jedes Mal überprüft). Wenn Sie jedoch wissen, dass die Datenbank klein ist, ist möglicherweise kein Leistungsbedarf für die Verwendung von Volltextindizes erforderlich. Der einzige Weg, dies zu ermitteln, ist eine intelligente Mittelung und einige Tests, die auf diesen Informationen basieren.

Genauigkeit ist eine andere Frage. Die Volltextindizierung ermöglicht es Ihnen, mehrere Dinge zu tun (Gewichtung, automatisches Zusammenpassen von Essen/Essen/Essen usw.), die Sie unmöglich in irgendeinem vernünftigen Zeitrahmen mit LIKE implementieren könnten. Die eigentliche Frage ist, ob Sie diese Funktionen benötigen.

Ohne die Beschreibung dieser Funktionen in der Volltextdokumentation zu lesen, werden Sie wirklich nicht wissen, wie Sie vorgehen sollten. Also, lies!

Auch ein paar grundlegende Tests (fügen Sie eine Reihe von Zeilen in einer Tabelle, vielleicht mit einer Art von öffentlichen Wörterbuch als Quelle von Wörtern) wird einen langen Weg, um Ihnen zu helfen, zu entscheiden.

0

Sie können leicht bessere Ergebnisse erzielen oder zumindest eine einfachere Implementierung mit Volltextindizierung durchführen. Aber es hängt davon ab, wie Sie es wollen ...

Was ich im Sinn habe ist, dass, wenn Sie nach zwei Wörtern suchen, mit LIKE müssen Sie dann manuell implementieren (zum Beispiel) eine Methode, um diejenigen mit zu gewichten beide höher in der Liste. Ein Volltextindex sollte dies für Sie tun und Ihnen erlauben, die Gewichtungen mithilfe der entsprechenden Syntax zu beeinflussen.

7

Eine Volltextsuche ist viel schneller. Vor allem wenn man viele Daten in verschiedenen Spalten bearbeitet.

Zusätzlich haben Sie sprachspezifische Suchunterstützung. Z.B. deutsche Umlaute wie "ü" in "über" werden auch gefunden, wenn sie als "über" gespeichert werden. Sie können auch Synonyme verwenden, mit denen Sie Suchanfragen automatisch erweitern oder bestimmte Ausdrücke ersetzen oder ersetzen können.

In einigen Fällen mögen genauer seit LIKE "% Die%" AND LIKE "% Matrix" wird auszusuchen "The Matrix", aber nicht "Matrix Reloaded", während Volltext Suche ignoriert " Die "und zurück beide. Das heißt, beide hätten wahrscheinlich ein besseres Ergebnis erzielt.

Das ist nicht korrekt. Mit der Volltextsyntax können Sie angeben, wie Sie suchen möchten. Z.B. Mit der CONTAINS-Anweisung können Sie exakte Wortanpassung sowie Fuzzy-Matching, Gewichte etc. verwenden.

Wenn Sie also Leistungsprobleme haben oder eine "Google-ähnliche" Suchfunktion bereitstellen möchten, wählen Sie die Volltextsuche Motor. Es ist auch sehr einfach zu konfigurieren.

6

Nur ein paar Anmerkungen:

  1. LIKE kann ein Index Seek verwenden, wenn Sie nicht Ihre LIKE mit% beginnen. Beispiel: WIE "Santa M%" ist gut! WIE '% Maria' ist schlecht! und kann eine Tabellen- oder Indexsuche verursachen, da dies nicht auf die übliche Weise indiziert werden kann.

  2. Dies ist sehr wichtig. Updates für Volltextindizes sind asynchron. Wenn Sie beispielsweise eine INSERT-Anweisung für eine Tabelle ausführen, gefolgt von einer SELECT-Anweisung für die Volltextsuche, bei der Sie erwarten, dass die neuen Daten angezeigt werden, erhalten Sie die Daten möglicherweise nicht sofort. Abhängig von Ihrer Konfiguration müssen Sie möglicherweise einige Sekunden oder einen Tag warten. Im Allgemeinen werden Volltextindizes ausgefüllt, wenn Ihr System nicht viele Anforderungen hat.

0

Um FullTextSearch in SQL Server als LIKE
Zuerst Sie haben eine StopList erstellen und zuweisen zu Ihrem Tisch

CREATE FULLTEXT STOPLIST [MyStopList]; 
GO 
ALTER FULLTEXT INDEX ON dbo.[MyTableName] SET STOPLIST [MyStopList] 
GO 

Zweitens verwenden Sie die folgende TSQL-Skript:

SELECT * FROM dbo.[MyTableName] AS mt 
WHERE CONTAINS((mt.ColumnName1,mt.ColumnName2,mt.ColumnName3), N'"*search text s*"') 
0

Wenn Sie nicht nur ein englisches Wort suchen, sagen Sie, dass Sie ein chinesisches Wort suchen, dann wie Ihre fts Wörter in Worte fasst Machen Sie Ihre Suche ein großes anders, wie ich hier ein Beispiel gab https://stackoverflow.com/a/31396975/301513. Aber ich weiß nicht, wie SQL Server chinesische Wörter tokenisiert, macht es einen guten Job dafür?