So verbessern Sie die Datenbanksuche mit der Volltextsuche in MySQL 5.6 unter Ubuntu 16.04

Einführung

Volltextsuche oder FTS ist eine Technik, die von Suchmaschinen verwendet wird, um Ergebnisse in einer Datenbank zu finden. Sie können es verwenden, um Suchergebnisse auf Websites wie Shops, Suchmaschinen, Zeitungen und mehr anzuzeigen.

Insbesondere ruft FTS Dokumente ab, die nicht den Suchkriterien entsprechen. Documents sind Datenbankentitäten, die Textdaten enthalten. Dies bedeutet, dass bei der Suche nach "Katzen und Hunden" durch eine von FTS unterstützte Anwendung Ergebnisse zurückgegeben werden können, die die Wörter getrennt enthalten (nur "Katzen" oder "Hunde") und die Wörter in einer anderen Reihenfolge enthalten ("Hunde und Katzen") oder enthalten Varianten der Wörter ("Katze" oder "Hund"). Dies gibt Anwendungen einen Vorteil darin, zu erraten, was der Benutzer meint, und schneller relevantere Ergebnisse zurückzugeben.

Technisch gesehen ermöglichen Datenbankverwaltungssysteme (DBMS) wie MySQL in der Regel teilweise Textsuchen mit + LIKE + - Klauseln. Bei großen Datenmengen sind diese Anforderungen jedoch in der Regel unzureichend. Sie beschränken sich auch darauf, die Eingaben des Benutzers genau abzugleichen. Dies bedeutet, dass eine Abfrage möglicherweise keine Ergebnisse liefert, selbst wenn Dokumente mit relevanten Informationen vorhanden sind.

Mit FTS können Sie eine leistungsfähigere Textsuchmaschine erstellen, ohne zusätzliche Abhängigkeiten von erweiterten Tools einführen zu müssen. In diesem Lernprogramm verwenden Sie MySQL 5.6, um eine Datenbank mithilfe der Volltextsuche abzufragen. Anschließend quantifizieren Sie die Ergebnisse nach ihrer Relevanz für die Sucheingabe und zeigen nur die besten Übereinstimmungen an.

Voraussetzungen

Bevor Sie mit diesem Tutorial beginnen, benötigen Sie:

Schritt 1 - Testdaten erstellen

Um die Volltextsuche auszuprobieren, benötigen wir einige Daten. In diesem Schritt erstellen wir eine Datenbank mit dem Namen "+ testdb " und einer Tabelle mit dem Namen " news +", die wir mit einigen Beispieldaten füllen, die Artikel von einer fiktiven News-Aggregator-Site darstellen.

Greifen Sie zunächst auf die MySQL-Konsole zu. Sie werden aufgefordert, das * root * -Kennwort einzugeben, das Sie bei der Installation von MySQL festgelegt haben.

mysql -u root -p

Sobald Sie verbunden sind, ändert sich Ihre Eingabeaufforderung in "+ mysql> +".

Als nächstes erstellen Sie eine neue Datenbank mit dem Namen "+ testdb +". Diese Datenbank enthält die Testdaten.

CREATE DATABASE testdb;

Wechseln Sie standardmäßig zur Verwendung der "+ testdb +" - Datenbank, damit Sie nicht den Namen der Datenbank angeben müssen, um darin enthaltene Objekte zu erstellen oder zu aktualisieren.

USE testdb;

Als nächstes erstellen Sie eine Tabelle in der Datenbank mit dem Namen "+ news +" mit Spalten für die Artikel eines Beispielnachrichtenaggregators.

CREATE TABLE news (
  id INT NOT NULL AUTO_INCREMENT,
  title TEXT NOT NULL,
  content TEXT NOT NULL,
  author TEXT NOT NULL,

  PRIMARY KEY (id)
);

Sehen wir uns an, was dieser Befehl bewirkt:

  • + CREATE TABLE + ist ein SQL-Befehl, der eine Tabelle erstellt, ähnlich wie viele andere Datenbanken.

  • + news + ist der Name der Tabelle.

  • + title,` + content` und + author sind Textspalten mit unbegrenzter Länge.

  • + NOT NULL + ist eine Deklaration, die verwendet wird, um Spalten zu kennzeichnen, die keine null -Werte haben können (obwohl sie möglicherweise enthalten) leere Zeichenketten).

  • "+ id " ist der Primärindex der Tabelle mit dem speziellen Typ " AUTO_INCREMENT +", der das ID-Feld automatisch mit der nächsten verfügbaren ID füllt.

Fügen Sie nun einige Beispieldaten zur Tabelle hinzu.

INSERT INTO news (id, title, content, author) VALUES
   (1, 'Pacific Northwest high-speed rail line', 'Currently there are only a few options for traveling the 140 miles between Seattle and Vancouver and none of them are ideal.', 'Greg'),
   (2, 'Hitting the beach was voted the best part of life in the region', 'Exploring tracks and trails was second most popular, followed by visiting the shops and then traveling to local parks.', 'Ethan'),
   (3, 'Machine Learning from scratch', 'Bare bones implementations of some of the foundational models and algorithms.', 'Jo');

Sehen wir uns an, was dieser Befehl bewirkt:

  • + INSERT + fügt Daten ein.

  • + INTO + gibt an, wo die Daten eingefügt werden sollen. In diesem Fall ist es die "+ news +" - Tabelle.

  • + (id, title, content, author) VALUES + gibt die Spalten an, in denen die Datenwerte jedes Eintrags gespeichert werden sollen.

  • Die letzten drei Zeilen sind die drei Datenzeilen, die wir der Tabelle hinzufügen. Jede enthält einen Beispielartikel für eine Nachrichtenwebsite mit einem "+ Titel ", etwas " Inhalt " und dem " Autor +".

Jeder Eintrag hat auch einen eindeutigen "+ id +" - Bezeichner, der automatisch in den Datenbankindex eingetragen wird. Der Datenbankindex ist eine Datenstruktur, die die Leistung von Datenabrufvorgängen verbessert. Dieser Index wird getrennt von den Hauptdaten gespeichert. Es wird bei jeder Änderung des Tabelleninhalts auf Kosten zusätzlicher Schreibvorgänge und vergleichsweise wenig Speicherplatz aktualisiert. Aufgrund der geringen Größe und der angepassten Datenstruktur können Indizes wesentlich effektiver ausgeführt werden als der Haupttabellenbereich zum Auswählen von Abfragen.

Nachdem wir einige Daten haben, können wir Abfragen schreiben, um diese Daten mit FTS zu durchsuchen.

Schritt 2 - Erstellen eines FTS-Index und Verwenden von FTS-Funktionen

Erstellen wir einen Index für die vorhandenen Textspalten, damit wir FTS verwenden können.

Dazu verwenden wir einen MySQL-exklusiven Befehl namens "+ FULLTEXT +". Dieser Befehl weist MySQL an, alle Felder, die mit FTS durchsucht werden sollen, in einem internen Index abzulegen.

ALTER TABLE news ADD FULLTEXT (title, content, author);

Dies funktioniert, indem alle Textspalten kombiniert und bereinigt werden (z. Entfernen der Interpunktion und Kleinschreibung von Großbuchstaben). Nachdem dieser Index erstellt wurde, wird er von jeder SQL-Abfrage aktualisiert, die den Inhalt der Quellentabelle ändert.

Versuchen Sie als nächstes, mit der Funktion + MATCH () AGAINST () + eine Volltextsuche nach „Seattle Beach“ durchzuführen.

SELECT * FROM news WHERE MATCH (title,content,author) AGAINST ('' IN NATURAL LANGUAGE MODE)\G

Der Teil + MATCH () + des Befehls gibt an, welche Spaltenmenge mit FTS indiziert wird. Es muss mit der Spaltenliste übereinstimmen, die Sie zum Erstellen des Index verwendet haben. Der Abschnitt "+ AGAINST () +" gibt an, nach welchem ​​Wort eine Volltextsuche durchgeführt wird. In diesem Beispiel handelt es sich um "Seattle Beach".

"+ IM NATÜRLICHEN SPRACHENMODUS +" bedeutet, dass die Suchwörter direkt von der Benutzereingabe ohne Vorverarbeitung bereitgestellt werden. MySQL geht standardmäßig von einem natürlichen Sprachmodus aus, sodass Sie ihn nicht explizit angeben müssen.

Das "+ \ G +" am Ende der obigen Abfrage bewirkt, dass jede Spalte in der Ausgabe in einer neuen Zeile gedruckt wird. Dadurch können lange Ergebnisse etwas besser lesbar sein. Die Ausgabe für den obigen Befehl sieht folgendermaßen aus:

Output*************************** 1. row ***************************
    id: 1
 title: Pacific Northwest high-speed rail line
content: Currently there are only a few options for traveling the 140 miles between  and Vancouver and none of them are ideal.
author: Greg
*************************** 2. row ***************************
    id: 2
 title: Hitting the  was voted the best part of life in the region
content: Exploring tracks and trails was second most popular, followed by visiting the shops and then traveling to local parks.
author: Ethan
2 rows in set (0.00 sec)

Keiner der Einträge enthielt den Ausdruck „Seattle Beach“. Da wir jedoch die Volltextsuche verwendeten, wurden immer noch zwei Ergebnisse erzielt: die erste Zeile, die nur das Wort „Seattle“ enthält, und die zweite Zeile, die nur das Wort enthält "Strand". Sie können zusätzliche Suchanfragen durchführen, indem Sie die Schlüsselwörter ändern, um die Ergebnisse anzuzeigen.

Da Sie jetzt FTS-Funktionen in SQL-Abfragen verwenden können, um die für eine Sucheingabe relevanten Zeilen zu finden, können Sie diese Ergebnisse relevanter machen.

Schritt 3 - Verfeinerung der FTS-Ergebnisse

Es gibt zwei Techniken, die dazu beitragen können, dass Volltextsuchergebnisse relevanter werden. Einer filtert nach dem Relevanzwert der Ergebnisse und der andere verwendet "+ IN BOOLEAN +", um bestimmte Wörter aus den Ergebnissen auszuschließen und einen maximalen Abstand zwischen den Suchbegriffen anzugeben.

Verwenden des Relevanzfaktors

Der Relevanzwert eines Ergebnisses gibt an, wie gut eine Übereinstimmung für den Suchbegriff ist, wobei 0 überhaupt nicht relevant ist. Der Relevanzfaktor basiert auf einer Reihe von Faktoren, einschließlich der Häufigkeit, mit der der Begriff in einem bestimmten Dokument gefunden wird, und der Anzahl der Dokumente, in denen der Begriff enthalten ist. MySQLs Dokumentation zur Volltextsuche geht in die Mathematik hinter der Berechnung dieser Zahl ein.

Erhalten Sie die Relevanzwerte für jede Zeile basierend auf der Abfrage "Reisen in Parks".

SELECT id, MATCH (title,content,author) AGAINST ('') as score FROM news;

Der Teil "+ als Punktzahl " dieses Befehls kennzeichnet die zweite Spalte in der Ausgabe als " Punktzahl ". Andernfalls würde es mit dem Befehl gekennzeichnet, der zum Auffüllen verwendet wird, in diesem Fall " MATCH (Titel, Inhalt, Autor) AGAINST (" Reisen in Parks ") +".

Das Ergebnis sieht ungefähr so ​​aus:

Output+----+----------------------+
| id | score                |
+----+----------------------+
|  1 | 0.031008131802082062 |
|  2 |  0.25865283608436584 |
|  2 |  0                    |
+----+----------------------+
3 rows in set (0.00 sec)

Die dritte Zeile weist eine Relevanzbewertung von 0 auf, da darin kein Suchbegriff enthalten ist. Die erste Zeile enthält das Wort "reisen", aber nicht "nach" oder "parken" und hat einen sehr niedrigen Relevanzwert von "+ 0,03 ". Die zweite Zeile, die alle Wörter enthält, hat den höchsten Relevanzwert von " 0,25 +".

Mit diesen Ergebnissen können Sie die relevantesten Ergebnisse zuerst oder nur die Ergebnisse zurückgeben, die über einem bestimmten Relevanzbereich liegen. Die Relevanzwerte variieren je nach Datensatz. Die Auswahl eines Grenzwerts erfordert daher eine manuelle Abstimmung.

Der folgende Befehl führt dieselbe Abfrage aus, fügt jedoch zwei Dinge hinzu:

  • Es werden nur Zeilen mit einer Relevanz ungleich Null angezeigt, indem "+ WHERE MATCH" (Titel, Inhalt, Autor) GEGEN "(")> 0 + "hinzugefügt wird

  • Es sortiert die Ergebnisse nach Relevanz, indem es "+ ORDER BY score DESC +" hinzufügt

SELECT id, MATCH (title,content,author) AGAINST ('') as score FROM news WHERE MATCH (title,content,author) AGAINST ('') > 0 ORDER BY score DESC;

Sie müssen die Funktion "+ MATCH () AGAINST () " in der Klausel " WHERE +" wiederholen, da SQL-Einschränkungen hinsichtlich der Elemente bestehen, die in dieser Klausel enthalten sein können.

Die Ausgabe sieht folgendermaßen aus:

Output+----+----------------------+
| id | score                |
+----+----------------------+
|  2 |  0.25865283608436584 |
|  1 | 0.031008131802082062 |
+----+----------------------+
2 rows in set (0.01 sec)

Das relevanteste Ergebnis, Zeile 2, wird zuerst angezeigt, gefolgt von der weniger relevanten Zeile 1. Zeile 3 wird überhaupt nicht angezeigt, da der Relevanzwert 0 ist.

Sie können die Grenzwerte ändern, um mit der Feinabstimmung Ihrer Ergebnisse fortzufahren. Wenn Sie beispielsweise "+ 0.1 " anstelle von " 0 +" als Cutoff verwenden, wird nur Zeile 2 zurückgegeben.

Verwenden von IN BOOLEAN

In Schritt 2 haben Sie den Standardmodus "+ IN NATURAL LANGUAGE" verwendet, wenn Sie einen Abfragebegriff angegeben haben. Es gibt einen anderen Modus, "+ IN BOOLEAN +", mit dem Sie bestimmte Wörter von einer Suche ausschließen, einen Bereich festlegen, in dem die Wörter in der Eingabe voneinander entfernt sein müssen, und mehr.

Verwenden Sie den Minus-Operator mit "+ IN BOOLEAN +", um einen Begriff in einer Abfrage auszulassen. Der folgende Befehl gibt Ergebnisse zurück, die das Wort "Reisen" enthalten, jedoch nicht das Wort "Seattle".

SELECT * FROM news WHERE MATCH (title,content,author) AGAINST ()\G

Die Ergebnisse zeigen nur Zeile 2:

Output*************************** 1. row ***************************
    id: 2
 title: Hitting the beach was voted the best part of life in the region
content: Exploring tracks and trails was second most popular, followed by visiting the shops and then traveling to local parks.
author: Ethan
1 row in set (0.01 sec)

Dies funktioniert, weil der Minus-Operator das DMS anweist, jedes Dokument mit den ausgeschlossenen Wörtern mit einer Relevanzbewertung von 0 zu markieren. In diesem Modus werden nur Ergebnisse mit einem Relevanzwert ungleich Null angezeigt.

Sie können auch "+ IN BOOLEAN MODE +" verwenden, um den maximalen Abstand zwischen Suchbegriffen festzulegen. Dieser Abstand wird in Worten gemessen und enthält vor allem die Suchbegriffe. Zum Beispiel hat der Ausdruck "Katzen und Hunde" einen Abstand von 3.

Der folgende Befehl gibt Ergebnisse zurück, in denen die Wörter "Reisen" und "Meilen" mit nicht mehr als 2 Wörtern dazwischen angezeigt werden.

SELECT * FROM news WHERE MATCH (title,content,author) AGAINST ()\G

Es wird ein Ergebnis angezeigt, das mit "+ Reisen über 140 Meilen" in Zeile 2 "+ Inhalt" übereinstimmt.

Output*************************** 1. row ***************************
    id: 1
 title: Pacific Northwest high-speed rail line
content: Currently there are only a few options for traveling the 140 miles between Seattle and Vancouver and none of them are ideal.
author: Greg
1 row in set (0.00 sec)

Wenn Sie das "+ @ 4 " im ursprünglichen Befehl in ein " @ 3 +" ändern, werden keine Ergebnisse angezeigt.

Das Einschränken Ihrer Suchergebnisse nach dem Abstand zwischen Suchbegriffen kann hilfreich sein, wenn Sie nach sehr großen Dokumenten mit unterschiedlichen Vokabularen suchen. Je kleiner der Abstand zwischen den Suchbegriffen ist, desto genauer sind die Ergebnisse. Die Feinabstimmung des Abstands hängt jedoch von den Dokumenten ab, mit denen Sie arbeiten. Beispielsweise kann eine Reihe von wissenschaftlichen Artikeln mit einer kleinen Wortlücke von 3 gut funktionieren, aber das Durchsuchen von Forenbeiträgen kann mit einer Lücke von 8 oder mehr besser funktionieren, je nachdem, wie breit oder eng die Ergebnisse sein sollen.

Fazit

In diesem Handbuch haben Sie die Volltextsuche in MySQL verwendet. Sie haben beim Erstellen eines Datenbankschemas für Ihre dokumentengesteuerte Datenbank einen Index erstellt und dann mithilfe spezieller Operatoren die relevantesten Ergebnisse bei der Abfrage ermittelt.

Wenn Sie die FTS-Funktionen von MySQL näher kennenlernen möchten, lesen Sie die MySQL 5.6 offizielle Dokumentation zur Volltextsuche.