Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Funktionsweise der MATCH()-Funktion in MySQL

In MySQL der MATCH() Funktion führt eine Volltextsuche durch. Es akzeptiert eine durch Kommas getrennte Liste von Tabellenspalten, die durchsucht werden sollen.

Die Tabelle/n muss/müssen einen FULLTEXT haben index, bevor Sie eine Volltextsuche nach ihnen durchführen können (obwohl boolesche Abfragen gegen eine MyISAM Suchindex kann — wenn auch langsam — auch ohne FULLTEXT funktionieren Index).

Sie können einen FULLTEXT erstellen Index beim Erstellen der Tabelle (mit dem CREATE TABLE -Anweisung), oder Sie können die ALTER TABLE verwenden -Anweisung oder die CREATE INDEX Anweisung, wenn die Tabelle bereits existiert.

Standardmäßig wird bei der Suche zwischen Groß- und Kleinschreibung unterschieden. Um eine Suche mit Berücksichtigung der Groß-/Kleinschreibung durchzuführen, verwenden Sie eine Sortierung mit Berücksichtigung der Groß-/Kleinschreibung oder eine binäre Sortierung für die indizierten Spalten.

Syntax

Die Syntax für MATCH() Funktion geht so:

MATCH (col1,col2,...) AGAINST (expr [search_modifier])

Wobei col1,col2,... ist die durch Kommas getrennte Liste der zu durchsuchenden Spalten und expr ist die Eingabezeichenfolge/der Ausdruck.

Der optionale search_modifier Mit dem Argument können Sie den Suchtyp angeben. Dies kann einer der folgenden Werte sein:

  • IN NATURAL LANGUAGE MODE
  • IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
  • IN BOOLEAN MODE
  • WITH QUERY EXPANSION

Der Standardmodus ist IN NATURAL LANGUAGE MODE .

Beispiel 1 – Grundlegende Verwendung

Hier ist ein Beispiel für die Verwendung dieser Funktion:

SELECT AlbumId, AlbumName
FROM Albums
WHERE MATCH(AlbumName) AGAINST('cool');

Ergebnis:

+---------+--------------------+
| AlbumId | AlbumName          |
+---------+--------------------+
|       5 | Casualties of Cool |
+---------+--------------------+

Hier ist die vollständige Tabelle, für die die obige Abfrage ausgeführt wurde:

SELECT AlbumId, AlbumName
FROM Albums;

Ergebnis:

+---------+--------------------------+
| AlbumId | AlbumName                |
+---------+--------------------------+
|       1 | Powerslave               |
|       2 | Powerage                 |
|       3 | Singing Down the Lane    |
|       4 | Ziltoid the Omniscient   |
|       5 | Casualties of Cool       |
|       6 | Epicloud                 |
|       7 | Somewhere in Time        |
|       8 | Piece of Mind            |
|       9 | Killers                  |
|      10 | No Prayer for the Dying  |
|      11 | No Sound Without Silence |
|      12 | Big Swing Face           |
|      13 | Blue Night               |
|      14 | Eternity                 |
|      15 | Scandinavia              |
|      16 | Long Lost Suitcase       |
|      17 | Praise and Blame         |
|      18 | Along Came Jones         |
|      19 | All Night Wrong          |
|      20 | The Sixteen Men of Tain  |
+---------+--------------------------+

Beispiel 2 – Fehler:„Kann den FULLTEXT-Index nicht finden“

InnoDB Tabellen müssen einen FULLTEXT haben index, bevor Ergebnisse einer Volltextsuche zurückgegeben werden. Wenn es keinen FULLTEXT hat index erhalten Sie wahrscheinlich die folgende Fehlermeldung:

ERROR 1191 (HY000): Can't find FULLTEXT index matching the column list

Wenn Sie diesen Fehler erhalten, müssen Sie einen FULLTEXT hinzufügen Index für alle Spalten, die Sie durchsuchen möchten (siehe nächstes Beispiel).

Die Ausnahme hiervon könnte sein, wenn Sie eine boolesche Abfrage auf MyISAM ausführen Suchindex.

Genauer gesagt heißt es in der MySQL-Dokumentation für boolesche Volltextsuchen wie folgt:

InnoDB Tabellen erfordern einen FULLTEXT Index auf alle Spalten des MATCH() Ausdruck, um boolesche Abfragen auszuführen. Boolesche Abfragen gegen ein MyISAM Suchindex kann auch ohne FULLTEXT funktionieren index, obwohl eine auf diese Weise ausgeführte Suche ziemlich langsam wäre.

Beispiel 3 – Hinzufügen eines FULLTEXT-Index zu einer bestehenden Tabelle

Hier ist ein Beispiel für das Hinzufügen eines FULLTEXT Index zu einer bestehenden Tabelle:

ALTER TABLE Albums  
ADD FULLTEXT(AlbumName);

In diesem Fall habe ich den Inhalt von AlbumName indiziert Säule.

Um mehrere Spalten zu indizieren, trennen Sie sie mit einem Komma (siehe nächstes Beispiel).

Beispiel 4 – Durchsuchen mehrerer Spalten

Wenn Sie glauben, dass Sie mehr als eine Spalte durchsuchen müssen, müssen Sie einen Index erstellen, der alle zu durchsuchenden Spalten enthält. Fügen Sie dazu einfach jede Spalte als durch Kommas getrennte Liste ein.

Hier ist ein Beispiel, wo ich einen FULLTEXT hinzufüge Index zum film Tabelle (die Teil der Sakila-Beispieldatenbank ist).

ALTER TABLE film 
ADD FULLTEXT(title, description);

In diesem Fall indiziere ich den Inhalt des title und description Spalten.

Jetzt haben wir einen FULLTEXT erstellt index für beide Spalten, können wir eine Volltextsuche gegen sie durchführen:

SELECT title, description
FROM film
WHERE MATCH(title, description) AGAINST('vertigo');

Ergebnis:

+-------------------+-----------------------------------------------------------------------------------------------------------+
| title             | description                                                                                               |
+-------------------+-----------------------------------------------------------------------------------------------------------+
| VERTIGO NORTHWEST | A Unbelieveable Display of a Mad Scientist And a Mad Scientist who must Outgun a Mad Cow in Ancient Japan |
+-------------------+-----------------------------------------------------------------------------------------------------------+

Hier ist eine weitere Suche, bei der der genaue Schlüsselsatz nicht übereinstimmt, aber jedes Schlüsselwort innerhalb dieses Satzes:

SELECT title, description
FROM film
WHERE MATCH(title, description) AGAINST('Iron Maiden');

Ergebnis:

+-------------+---------------------------------------------------------------------------------------------------------+
| title       | description                                                                                             |
+-------------+---------------------------------------------------------------------------------------------------------+
| IRON MOON   | A Fast-Paced Documentary of a Mad Cow And a Boy who must Pursue a Dentist in A Baloon                   |
| MAIDEN HOME | A Lacklusture Saga of a Moose And a Teacher who must Kill a Forensic Psychologist in A MySQL Convention |
+-------------+---------------------------------------------------------------------------------------------------------+

Wenn Sie möchten, dass nur der genaue Ausdruck übereinstimmt, setzen Sie ihn in doppelte Anführungszeichen:

SELECT title, description
FROM film
WHERE MATCH(title, description) AGAINST('"Iron Maiden"');

Ergebnis:

Empty set (0.00 sec)

In diesem Fall enthält keine der Spalten genau diesen Ausdruck.

Beispiel 5 – Rückgabe der Relevanzbewertung

Wann immer Sie MATCH() verwenden Funktion wird jeder Zeile in der Tabelle ein Relevanzwert zugewiesen. Mit anderen Worten, jede Zeile erhält eine Punktzahl, die bestimmt, wie relevant sie für den Suchbegriff ist. Die Ergebnisse werden dann nach Relevanz geordnet (höchste Relevanz zuerst).

Relevanzwerte sind nichtnegative Gleitkommazahlen. Null Relevanz bedeutet keine Ähnlichkeit. Die Relevanz wird basierend auf der Anzahl der Wörter in der Zeile (Dokument), der Anzahl der eindeutigen Wörter in der Zeile, der Gesamtzahl der Wörter in der Sammlung und der Anzahl der Zeilen, die ein bestimmtes Wort enthalten, berechnet.

Um die Relevanz jedes Ergebnisses zurückzugeben, fügen Sie einfach MATCH() ein Funktion in Ihrer Liste der auszuwählenden Spalten.

Beispiel:

SELECT 
  MATCH(title, description) AGAINST('Iron Maiden') AS Relevance,
  title, 
  description
FROM film
WHERE MATCH(title, description) AGAINST('Iron Maiden');

Ergebnis:

+-----------+-------------+---------------------------------------------------------------------------------------------------------+
| Relevance | title       | description                                                                                             |
+-----------+-------------+---------------------------------------------------------------------------------------------------------+
|         9 | IRON MOON   | A Fast-Paced Documentary of a Mad Cow And a Boy who must Pursue a Dentist in A Baloon                   |
|         9 | MAIDEN HOME | A Lacklusture Saga of a Moose And a Teacher who must Kill a Forensic Psychologist in A MySQL Convention |
+-----------+-------------+---------------------------------------------------------------------------------------------------------+

In diesem Fall ist der Relevanzwert für beide Zeilen sehr hoch.

Hier ist eine andere, bei der die Relevanz geringer ist:

SELECT 
  MATCH(title, description) AGAINST('Saga of a Moose') AS Relevance,
  title, 
  description
FROM film
WHERE MATCH(title, description) AGAINST('Saga of a Moose')
LIMIT 15;

Ergebnis:

+--------------------+------------------------+---------------------------------------------------------------------------------------------------------+
| Relevance          | title                  | description                                                                                             |
+--------------------+------------------------+---------------------------------------------------------------------------------------------------------+
| 2.4431142807006836 | CAPER MOTIONS          | A Fateful Saga of a Moose And a Car who must Pursue a Woman in A MySQL Convention                       |
| 2.4431142807006836 | DATE SPEED             | A Touching Saga of a Composer And a Moose who must Discover a Dentist in A MySQL Convention             |
| 2.4431142807006836 | DELIVERANCE MULHOLLAND | A Astounding Saga of a Monkey And a Moose who must Conquer a Butler in A Shark Tank                     |
| 2.4431142807006836 | FLASH WARS             | A Astounding Saga of a Moose And a Pastry Chef who must Chase a Student in The Gulf of Mexico           |
| 2.4431142807006836 | HAROLD FRENCH          | A Stunning Saga of a Sumo Wrestler And a Student who must Outrace a Moose in The Sahara Desert          |
| 2.4431142807006836 | MAIDEN HOME            | A Lacklusture Saga of a Moose And a Teacher who must Kill a Forensic Psychologist in A MySQL Convention |
| 2.4431142807006836 | SHANE DARKNESS         | A Action-Packed Saga of a Moose And a Lumberjack who must Find a Woman in Berlin                        |
| 2.4431142807006836 | SLEEPLESS MONSOON      | A Amazing Saga of a Moose And a Pastry Chef who must Escape a Butler in Australia                       |
| 2.4431142807006836 | WAKE JAWS              | A Beautiful Saga of a Feminist And a Composer who must Challenge a Moose in Berlin                      |
| 2.4431142807006836 | WONKA SEA              | A Brilliant Saga of a Boat And a Mad Scientist who must Meet a Moose in Ancient India                   |
| 1.2399028539657593 | AIRPLANE SIERRA        | A Touching Saga of a Hunter And a Butler who must Discover a Butler in A Jet Boat                       |
| 1.2399028539657593 | ALASKA PHANTOM         | A Fanciful Saga of a Hunter And a Pastry Chef who must Vanquish a Boy in Australia                      |
| 1.2399028539657593 | ARMY FLINTSTONES       | A Boring Saga of a Database Administrator And a Womanizer who must Battle a Waitress in Nigeria         |
| 1.2399028539657593 | BEAR GRACELAND         | A Astounding Saga of a Dog And a Boy who must Kill a Teacher in The First Manned Space Station          |
| 1.2399028539657593 | BERETS AGENT           | A Taut Saga of a Crocodile And a Boy who must Overcome a Technical Writer in Ancient China              |
+--------------------+------------------------+---------------------------------------------------------------------------------------------------------+

Beachten Sie, dass die Ergebnismenge viel größer gewesen wäre, wenn ich LIMIT 15 nicht verwendet hätte um die Anzahl der Ergebnisse auf 15 zu begrenzen.

Beispiel 6 – Nur Ergebnisse über einem bestimmten Relevanzwert zurückgeben

Wir können das vorherige Beispiel noch einen Schritt weiterführen und nur die Ergebnisse mit einer bestimmten Relevanzbewertung herausfiltern. In diesem Fall gebe ich an, dass die Relevanzbewertung höher als 2 sein muss.

Seien Sie dabei jedoch vorsichtig. Wie oben gesehen, können Relevanzwerte sehr hoch oder sehr niedrig sein, abhängig von Faktoren wie z. B. wie viel Text in der Spalte ist, wie viele andere Zeilen mit dem Suchbegriff übereinstimmen usw.

SELECT 
  MATCH(title, description) AGAINST('Saga of a Moose') AS Relevance,
  title, 
  description
FROM film
WHERE MATCH(title, description) AGAINST('Saga of a Moose') > 2;

Ergebnis:

+--------------------+------------------------+---------------------------------------------------------------------------------------------------------+
| Relevance          | title                  | description                                                                                             |
+--------------------+------------------------+---------------------------------------------------------------------------------------------------------+
| 2.4431142807006836 | CAPER MOTIONS          | A Fateful Saga of a Moose And a Car who must Pursue a Woman in A MySQL Convention                       |
| 2.4431142807006836 | DATE SPEED             | A Touching Saga of a Composer And a Moose who must Discover a Dentist in A MySQL Convention             |
| 2.4431142807006836 | DELIVERANCE MULHOLLAND | A Astounding Saga of a Monkey And a Moose who must Conquer a Butler in A Shark Tank                     |
| 2.4431142807006836 | FLASH WARS             | A Astounding Saga of a Moose And a Pastry Chef who must Chase a Student in The Gulf of Mexico           |
| 2.4431142807006836 | HAROLD FRENCH          | A Stunning Saga of a Sumo Wrestler And a Student who must Outrace a Moose in The Sahara Desert          |
| 2.4431142807006836 | MAIDEN HOME            | A Lacklusture Saga of a Moose And a Teacher who must Kill a Forensic Psychologist in A MySQL Convention |
| 2.4431142807006836 | SHANE DARKNESS         | A Action-Packed Saga of a Moose And a Lumberjack who must Find a Woman in Berlin                        |
| 2.4431142807006836 | SLEEPLESS MONSOON      | A Amazing Saga of a Moose And a Pastry Chef who must Escape a Butler in Australia                       |
| 2.4431142807006836 | WAKE JAWS              | A Beautiful Saga of a Feminist And a Composer who must Challenge a Moose in Berlin                      |
| 2.4431142807006836 | WONKA SEA              | A Brilliant Saga of a Boat And a Mad Scientist who must Meet a Moose in Ancient India                   |
+--------------------+------------------------+---------------------------------------------------------------------------------------------------------+

Beispiel 7 – Null-Relevanz-Ergebnisse einbeziehen

Hier ist ein Beispiel für das Auflisten der Relevanzwerte für jede Zeile, selbst wenn der Relevanzwert Null ist. Wir können dies tun, indem wir MATCH() nicht verwenden Funktion im WHERE Klausel.

In diesem Beispiel verwende ich eigentlich kein WHERE Klausel. Ich verwende nur ein LIMIT Klausel, um die Anzahl der Ergebnisse zu begrenzen.

SELECT 
  MATCH(title, description) AGAINST('Scientist') AS Relevance,
  title, 
  description
FROM film
LIMIT 15;

Ergebnis:

+-------------------+------------------+-----------------------------------------------------------------------------------------------------------------------+
| Relevance         | title            | description                                                                                                           |
+-------------------+------------------+-----------------------------------------------------------------------------------------------------------------------+
| 1.026631474494934 | ACADEMY DINOSAUR | A Epic Drama of a Feminist And a Mad Scientist who must Battle a Teacher in The Canadian Rockies                      |
|                 0 | ACE GOLDFINGER   | A Astounding Epistle of a Database Administrator And a Explorer who must Find a Car in Ancient China                  |
|                 0 | ADAPTATION HOLES | A Astounding Reflection of a Lumberjack And a Car who must Sink a Lumberjack in A Baloon Factory                      |
|                 0 | AFFAIR PREJUDICE | A Fanciful Documentary of a Frisbee And a Lumberjack who must Chase a Monkey in A Shark Tank                          |
|                 0 | AFRICAN EGG      | A Fast-Paced Documentary of a Pastry Chef And a Dentist who must Pursue a Forensic Psychologist in The Gulf of Mexico |
|                 0 | AGENT TRUMAN     | A Intrepid Panorama of a Robot And a Boy who must Escape a Sumo Wrestler in Ancient China                             |
|                 0 | AIRPLANE SIERRA  | A Touching Saga of a Hunter And a Butler who must Discover a Butler in A Jet Boat                                     |
|                 0 | AIRPORT POLLOCK  | A Epic Tale of a Moose And a Girl who must Confront a Monkey in Ancient India                                         |
| 2.053262948989868 | ALABAMA DEVIL    | A Thoughtful Panorama of a Database Administrator And a Mad Scientist who must Outgun a Mad Scientist in A Jet Boat   |
|                 0 | ALADDIN CALENDAR | A Action-Packed Tale of a Man And a Lumberjack who must Reach a Feminist in Ancient China                             |
|                 0 | ALAMO VIDEOTAPE  | A Boring Epistle of a Butler And a Cat who must Fight a Pastry Chef in A MySQL Convention                             |
|                 0 | ALASKA PHANTOM   | A Fanciful Saga of a Hunter And a Pastry Chef who must Vanquish a Boy in Australia                                    |
|                 0 | ALI FOREVER      | A Action-Packed Drama of a Dentist And a Crocodile who must Battle a Feminist in The Canadian Rockies                 |
|                 0 | ALICE FANTASIA   | A Emotional Drama of a A Shark And a Database Administrator who must Vanquish a Pioneer in Soviet Georgia             |
| 1.026631474494934 | ALIEN CENTER     | A Brilliant Drama of a Cat And a Mad Scientist who must Battle a Feminist in A MySQL Convention                       |
+-------------------+------------------+-----------------------------------------------------------------------------------------------------------------------+

Beispiel 8 – Boolescher Modus

MySQL ermöglicht es uns, Volltextsuchen im booleschen Modus auszuführen. Fügen Sie dazu den IN BOOLEAN MODE hinzu Modifikator für Ihre Abfrage.

Im booleschen Modus können Sie Operatoren wie + verwenden und - um anzugeben, ob ein bestimmtes Wort oder eine Phrase vorhanden sein muss oder nicht.

Im folgenden Beispiel stelle ich jedem Wort ein Pluszeichen voran (+ ), um anzugeben, dass beide Wörter vorhanden sein müssen.

SELECT 
  title, 
  description
FROM film
WHERE MATCH(title, description) AGAINST('+Saga +Moose' IN BOOLEAN MODE)
LIMIT 3;

Ergebnis:

+------------------------+---------------------------------------------------------------------------------------------+
| title                  | description                                                                                 |
+------------------------+---------------------------------------------------------------------------------------------+
| CAPER MOTIONS          | A Fateful Saga of a Moose And a Car who must Pursue a Woman in A MySQL Convention           |
| DATE SPEED             | A Touching Saga of a Composer And a Moose who must Discover a Dentist in A MySQL Convention |
| DELIVERANCE MULHOLLAND | A Astounding Saga of a Monkey And a Moose who must Conquer a Butler in A Shark Tank         |
+------------------------+---------------------------------------------------------------------------------------------+

Im nächsten Beispiel ändere ich eines der Pluszeichen in ein Minuszeichen (- ). Das bedeutet, dass nur die Zeilen angezeigt werden, die das Wort Saga enthalten werden zurückgegeben, aber nur, wenn sie es nicht tun enthalten auch Moose :

SELECT 
  title, 
  description
FROM film
WHERE MATCH(title, description) AGAINST('+Saga -Moose' IN BOOLEAN MODE)
LIMIT 3;

Ergebnis:

+------------------+-------------------------------------------------------------------------------------------------+
| title            | description                                                                                     |
+------------------+-------------------------------------------------------------------------------------------------+
| AIRPLANE SIERRA  | A Touching Saga of a Hunter And a Butler who must Discover a Butler in A Jet Boat               |
| ALASKA PHANTOM   | A Fanciful Saga of a Hunter And a Pastry Chef who must Vanquish a Boy in Australia              |
| ARMY FLINTSTONES | A Boring Saga of a Database Administrator And a Womanizer who must Battle a Waitress in Nigeria |
+------------------+-------------------------------------------------------------------------------------------------+

Das Minuszeichen wird verwendet, um Ergebnisse auszuschließen, die sonst zurückgegeben würden. Wenn also allen unseren Suchwörtern ein Minuszeichen vorangestellt ist, wird ein leerer Satz zurückgegeben.

SELECT 
  title, 
  description
FROM film
WHERE MATCH(title, description) AGAINST('-Saga -Moose' IN BOOLEAN MODE)
LIMIT 3;

Ergebnis:

Empty set (0.00 sec)

Es gibt viele weitere Operatoren, die mit booleschen Suchen verwendet werden können, wie z. B. ~ , < , > , * , und mehr. Ausführlichere Informationen zur Verwendung des booleschen Modus finden Sie in der MySQL-Dokumentation für boolesche Volltextsuchen.

Beispiel 9 – Mit blinder Abfrageerweiterung

Sie können den WITH QUERY EXPANSION verwenden oder IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION Modifikatoren, um eine blinde Abfrageerweiterung durchzuführen. Dies kann nützlich sein, wenn der Suchbegriff sehr kurz ist und die zurückgegebenen Ergebnisse zu eng sein könnten (wodurch potenziell relevante Dokumente ausgeschlossen werden).

Die Abfrageerweiterung kann die Suche erweitern, indem Zeilen zurückgegeben werden, die andernfalls nicht zurückgegeben würden. Insbesondere wenn eine nicht übereinstimmende Zeile Wörter enthält, die auch in einer übereinstimmenden Zeile enthalten sind, könnte diese nicht übereinstimmende Zeile zu einer übereinstimmenden Zeile werden. Mit anderen Worten, eine nicht übereinstimmende Zeile kann immer noch zurückgegeben werden, einfach weil sie andere Wörter mit einer übereinstimmenden Zeile teilt.

Zur Veranschaulichung hier eine normale Suche ohne Abfrageerweiterung:

SELECT AlbumId, AlbumName
FROM Albums
WHERE MATCH(AlbumName) AGAINST('Blue' IN NATURAL LANGUAGE MODE);

Ergebnis:

+---------+------------+
| AlbumId | AlbumName  |
+---------+------------+
|      13 | Blue Night |
+---------+------------+

Ich habe ausdrücklich IN NATURAL LANGUAGE MODE angegeben aber dies ist der Standardmodus, also hätte ich diesen Modifikator auch weglassen können, wenn ich wollte.

Und hier ist die gleiche Suche mit Abfrageerweiterung:

SELECT AlbumId, AlbumName
FROM Albums
WHERE MATCH(AlbumName) AGAINST('Blue' WITH QUERY EXPANSION);

Ergebnis:

+---------+-----------------+
| AlbumId | AlbumName       |
+---------+-----------------+
|      13 | Blue Night      |
|      19 | All Night Wrong |
+---------+-----------------+

In diesem Fall werden zwei Ergebnisse zurückgegeben. Beachten Sie, dass das zweite Ergebnis den Suchbegriff nicht enthält (blue ). Aber es enthält das Wort Night was auch im ersten Ergebnis steht. Die erweiterte Abfrage hält dies also für gut genug, um eine Übereinstimmung zu erzielen.

Albumnamen sind wahrscheinlich kein sehr guter Anwendungsfall für den Abfrageerweiterungsmodus. Ein besserer Anwendungsfall wäre beispielsweise eine Suche nach Datenbank , wobei eine erweiterte Abfrage möglicherweise auch Dokumente zurückgibt, die Namen wie MySQL enthalten , Oracle , usw., auch wenn sie den Ausdruck database nicht enthalten .

Hier ist ein weiteres Beispiel. In diesem Beispiel werden jedoch doppelte Anführungszeichen verwendet, um anzugeben, dass der gesamte Suchbegriff vorhanden sein soll.

Wenn wir die Suche ohne durchführen Abfrageerweiterung:

SELECT 
  title, 
  description
FROM film
WHERE MATCH(title, description) AGAINST('"Feminist And a Mad Scientist"')
LIMIT 3;

Ergebnis:

+------------------+--------------------------------------------------------------------------------------------------+
| title            | description                                                                                      |
+------------------+--------------------------------------------------------------------------------------------------+
| ACADEMY DINOSAUR | A Epic Drama of a Feminist And a Mad Scientist who must Battle a Teacher in The Canadian Rockies |
+------------------+--------------------------------------------------------------------------------------------------+

Es wird nur ein Ergebnis zurückgegeben (es ist das einzige Ergebnis, das den gesamten Ausdruck genau so enthält, wie er eingegeben wurde).

Aber wenn wir eine blinde Abfrageerweiterung verwenden, passiert Folgendes:

SELECT 
  title, 
  description
FROM film
WHERE MATCH(title, description) AGAINST('"Feminist And a Mad Scientist"' WITH QUERY EXPANSION)
LIMIT 3;

Ergebnis:

+--------------------+------------------------------------------------------------------------------------------------------+
| title              | description                                                                                          |
+--------------------+------------------------------------------------------------------------------------------------------+
| ACADEMY DINOSAUR   | A Epic Drama of a Feminist And a Mad Scientist who must Battle a Teacher in The Canadian Rockies     |
| DINOSAUR SECRETARY | A Action-Packed Drama of a Feminist And a Girl who must Reach a Robot in The Canadian Rockies        |
| VICTORY ACADEMY    | A Insightful Epistle of a Mad Scientist And a Explorer who must Challenge a Cat in The Sahara Desert |
+--------------------+------------------------------------------------------------------------------------------------------+

Die erste Zeile ist die gleiche wie ohne die Abfrageerweiterung. Die Abfrage geht dann jedoch und gibt Zeilen zurück, die nur Teile unseres Suchbegriffs enthalten. Dieses Ergebnis ist nur auf drei begrenzt, weil ich LIMIT 3 verwendet habe . Die tatsächlichen Ergebnisse sind viel größer:

SELECT COUNT(*)
FROM film
WHERE MATCH(title, description) AGAINST('"Feminist And a Mad Scientist"' WITH QUERY EXPANSION);

Ergebnis:

+----------+
| COUNT(*) |
+----------+
|     1000 |
+----------+

Es ist durchaus möglich, dass viele dieser Ergebnisse für den Suchbegriff völlig irrelevant sind. Daher funktioniert die blinde Sucherweiterung normalerweise am besten für kürzere Suchbegriffe.

Weitere Informationen zur Verwendung von blinder Abfrageerweiterung finden Sie in der MySQL-Dokumentation:Volltextsuche mit Abfrageerweiterung.