Heim  >  Artikel  >  Datenbank  >  MySQL-Grundlagen-Tutorial 10 – Funktion Volltextsuchfunktion

MySQL-Grundlagen-Tutorial 10 – Funktion Volltextsuchfunktion

黄舟
黄舟Original
2017-02-24 11:44:321686Durchsuche

Syntax:

  • MATCH (col1,col2,...) AGAINST (expr [IM BOOLEAN-MODUS | MIT ABFRAGEERWEITERUNG])

MySQL unterstützt Volltextindizierung und Suchfunktionen. Der Volltextindextyp FULLTEXT-Index in MySQL. FULLTEXT-Indizes sind nur für MyISAM-Tabellen verfügbar; sie können aus CHAR-, VARCHAR- oder TEXT-Spalten als Teil einer CREATE TABLE-Anweisung erstellt oder später mit ALTER TABLE oder CREATE INDEX hinzugefügt werden. Bei größeren Datensätzen ist die Eingabe Ihrer Daten in eine Tabelle ohne FULLTEXT-Index und die anschließende Erstellung des Index schneller als die Eingabe der Daten in einen vorhandenen FULLTEXT-Index.

Die Volltextsuche wird mit der Funktion MATCH() durchgeführt.

mysql> CREATE TABLE articles (    
->   id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,    
->   title VARCHAR(200),    
->   body TEXT,    
->   FULLTEXT (title,body)    
-> );Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO articles (title,body) VALUES    
-> ('MySQL Tutorial','DBMS stands for DataBase ...'),    
-> ('How To Use MySQL Well','After you went through a ...'),    
-> ('Optimizing MySQL','In this tutorial we will show ...'),    
-> ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),    
-> ('MySQL vs. YourSQL','In the following database comparison ...'),    
-> ('MySQL Security','When configured properly, MySQL ...');Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM articles    
-> WHERE MATCH (title,body) AGAINST ('database');
+----+-------------------+------------------------------------------+
| id | title             | body          |
+----+-------------------+------------------------------------------+
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
|  1 | MySQL Tutorial    | DBMS stands for DataBase ...            |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)

Die Funktion MATCH() führt eine Suche in natürlicher Sprache innerhalb der Datenbank nach einer Zeichenfolge durch. Eine Datenbank ist ein Satz von 1 oder 2 Spalten, die in FULLTEXT enthalten sind. Der Suchstring wird als Parameter an AGAINST() übergeben. Für jede Zeile in der Tabelle gibt MATCH() einen Korrelationswert zurück, d. h. ein Ähnlichkeitsmaß zwischen der Suchzeichenfolge und dem Text in dieser Zeile in der angegebenen Spalte in der MATCH()-Tabelle.

Standardmäßig werden Suchvorgänge ohne Berücksichtigung der Groß-/Kleinschreibung durchgeführt. Sie können jedoch eine Volltextsuche unter Berücksichtigung der Groß- und Kleinschreibung durchführen, indem Sie eine binäre Sortierung für die indizierten Spalten verwenden. Beispielsweise können Sie einer Spalte, die den Zeichensatz „latin1“ verwendet, die Sortiermethode „latin1_bin“ zuweisen, wodurch bei Volltextsuchen die Groß-/Kleinschreibung beachtet wird.

Wie im obigen Beispiel ist der relevante Wert eine nicht negative Gleitkommazahl, wenn MATCH() in einer WHERE-Anweisung verwendet wird. Nullkorrelation bedeutet keine Ähnlichkeit. Die Korrelation wird basierend auf der Anzahl der Wörter in der Zeile, der Anzahl der eindeutigen Wörter in der Zeile, der Gesamtzahl der Wörter in der Datenbank und der Anzahl der Dateien (Zeilen), die das eindeutige Wort enthalten, berechnet.

Für die Volltextsuche in natürlicher Sprache ist es erforderlich, dass die in der Funktion MATCH() genannten Spalten mit den Spalten übereinstimmen, die in einigen FULLTEXT-Indizes in Ihrer Tabelle enthalten sind. Bitte beachten Sie für die obige Abfrage, dass die in der Funktion MATCH() benannten Spalten (Titel und Volltext) mit den Spalten im FULLTEXT-Index der Artikeltabelle identisch sind. Wenn Sie Titel und Volltext getrennt durchsuchen möchten, sollten Sie für jede Spalte einen VOLLTEXT-Index erstellen.

Alternativ können Sie eine boolesche Suche oder eine Suche mithilfe der Abfrageerweiterung durchführen.

Das obige Beispiel zeigt im Wesentlichen, wie die Funktion MATCH() verwendet wird, die Zeilen in absteigender Korrelationsreihenfolge zurückgibt. Das folgende Beispiel zeigt, wie der relevante Wert explizit abgerufen wird. Die Reihenfolge der zurückgegebenen Zeilen ist unsicher, da die SELECT-Anweisung keine WHERE- oder ORDER BY-Klausel enthält:

mysql> SELECT id, MATCH (title,body) AGAINST ('Tutorial')    
-> FROM articles;
+----+-----------------------------------------+
| id | MATCH (title,body) AGAINST ('Tutorial') |
+----+-----------------------------------------+
|  1 |                        0.65545833110809 |
|  2 |                                       0 |
|  3 |                        0.66266459226608 |
|  4 |                                       0 |
|  5 |                                       0 |
|  6 |                                       0 |
+----+-----------------------------------------+
6 rows in set (0.00 sec)

Das folgende Beispiel ist komplizierter. Die Abfrage gibt die relevanten Werte zurück und sortiert die Zeilen nach abnehmender Relevanz. Um dieses Ergebnis zu erzielen, sollten Sie MATCH() zweimal angeben: einmal in der SELECT-Liste und einmal in der WHERE-Klausel. Dadurch entsteht kein zusätzlicher Verwaltungsaufwand, da der MySQL-Optimierer feststellt, dass die beiden MATCH()-Aufrufe identisch sind, und den Volltextsuchcode nur einmal aktiviert.

mysql> SELECT id, body, MATCH (title,body) AGAINST    
-> ('Security implications of running MySQL as root') AS score    
-> FROM articles WHERE MATCH (title,body) AGAINST    
-> ('Security implications of running MySQL as root');
+----+-------------------------------------+-----------------+
| id | body                                | score           |
+----+-------------------------------------+-----------------+
|  4 | 1. Never run mysqld as root. 2. ... | 1.5219271183014 |
|  6 | When configured properly, MySQL ... | 1.3114095926285 |
+----+-------------------------------------+-----------------+
2 rows in set (0.00 sec)

Es gibt 2 Zeilen in der Tabelle (0,00 Sekunden)

Die Ausführung von MySQL FULLTEXT behandelt jede Folge von Einzelwort-Zeichenprototypen (Buchstaben, Zahlen und Unterstrichteile) als Wort . Diese Sequenz kann auch einfache Anführungszeichen (') enthalten, es darf jedoch nicht mehr als eins in einer Zeile stehen. Das bedeutet, dass aaa'bbb als ein Wort behandelt wird, während aaa''bbb als zwei Wörter behandelt wird. Einfache Anführungszeichen vor oder nach einem Wort werden vom FULLTEXT-Parser entfernt; aus „aaa'bbb“ wird aaa'bbb.

Der FULLTEXT-Parser bestimmt, wo ein Wort beginnt und endet, indem er nach bestimmten Trennzeichen sucht, wie zum Beispiel „ “ (Leerzeichen), , (Komma) und (Punkt). Wenn Wörter nicht durch Trennzeichen getrennt sind (z. B. im Chinesischen), kann der FULLTEXT-Parser die Anfangs- und Endpositionen eines Wortes nicht ermitteln. Um Wörter oder andere indizierte Begriffe zu einem FULLTEXT-Index in einer solchen Sprache hinzufügen zu können, müssen Sie sie vorverarbeiten, sodass sie durch ein beliebiges Trennzeichen wie „ getrennt werden.

Einige Wörter werden in ignoriert Volltextsuche:

  • Jedes zu kurze Wort wird ignoriert. Die standardmäßige Mindestlänge eines bei der Volltextsuche gefundenen Wortes ist

  • Wörter in Stoppwörtern werden ignoriert. Es gibt ein eingebautes Stoppwort, das durch benutzerdefinierte Listen überschrieben werden kann

  • Jedes richtige Wort im Vokabular und in der Abfrage wird anhand seiner Bedeutung im Vokabular und in der Abfrage gemessen. Auf diese Weise hat ein Wort, das in vielen Dokumenten vorkommt, eine geringere Bedeutung (und das haben sogar viele Wörter). Null-Wichtigkeit) aufgrund seines geringeren semantischen Werts in diesem bestimmten Vokabular. Wenn das Wort hingegen selten ist, erhält es eine höhere Bedeutung. Die Bedeutung der Wörter wird dann kombiniert und zur Berechnung der Relevanz der Zeile verwendet.

    这项技术最适合同大型词库一起使用 (事实上, 此时它经过仔细的调整 )。对于很小的表,单词分布并不能充分反映它们的语义价值, 而这个模式有时可能会产生奇特的结果。例如, 虽然单词 “MySQL” 出现在文章表中的每一行,但对这个词的搜索可能得不到任何结果:

    mysql> SELECT * FROM articles

    -> WHERE MATCH (title,body) AGAINST ('MySQL');

    找不到搜索的词(0.00 秒)

    这个搜索的结果为空,原因是单词 “MySQL” 出现在至少全文的50%的行中。 因此, 它被列入停止字。对于大型数据集,使用这个操作最合适不过了----一个自然语言问询不会从一个1GB 的表每隔一行返回一次。对于小型数据集,它的用处可能比较小。

    一个符合表中所有行的内容的一半的单词查找相关文档的可能性较小。事实上, 它更容易找到很多不相关的内容。我们都知道,当我们在因特网上试图使用搜索引擎寻找资料的时候,这种情况发生的频率颇高。可以推论,包含该单词的行因其所在特别数据集 而被赋予较低的语义价值。 一个给定的词有可能在一个数据集中拥有超过其50%的域值,而在另一个数据集却不然。

    当你第一次尝试使用全文搜索以了解其工作过程时,这个50% 的域值提供重要的蕴涵操作:若你创建了一个表,并且只将文章的1、2行插入其中, 而文中的每个单词在所有行中出现的机率至少为  50% 。那么结果是你什么也不会搜索到。一定要插入至少3行,并且多多益善。需要绕过该50% 限制的用户可使用布尔搜索代码。

    1. 布尔全文搜索

    利用IN BOOLEAN MODE修改程序, MySQL 也可以执行布尔全文搜索:

    mysql> SELECT * FROM articles WHERE MATCH (title,body)    
    -> AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
    +----+-----------------------+-------------------------------------+
    | id | title                 | body                                |
    +----+-----------------------+-------------------------------------+
    |  1 | MySQL Tutorial        | DBMS stands for DataBase ...        |
    |  2 | How To Use MySQL Well | After you went through a ...        |
    |  3 | Optimizing MySQL      | In this tutorial we will show ...   |
    |  4 | 1001 MySQL Tricks     | 1. Never run mysqld as root. 2. ... |
    |  6 | MySQL Security        | When configured properly, MySQL ... |
    +----+-----------------------+-------------------------------------+

    这个问询检索所有包含单词“MySQL”的行,但检索包含单词“YourSQL”的行。

    布尔全文搜索具有以下特点:

    • 它们不使用 50% 域值。.

    • 它们不会按照相关性渐弱的顺序将行进行分类。你可以从上述问询结果中看到这一点:相关性最高的行是一个包含两个“MySQL” 的行,但它被列在最后的位置,而不是开头位置。

    • 即使没有FULLTEXT,它们仍然可以工作,尽管这种方式的搜索执行的速度非常之慢。

    • 最小单词长度全文参数和最大单词长度全文参数均适用。

    • 停止字适用。

    布尔全文搜索的性能支持以下操作符:

    • +

    一个前导的加号表示该单词必须 出现在返回的每一行的开头位置。

    • -

    一个前导的减号表示该单词一定不能出现在任何返回的行中。

    • (无操作符)

    在默认状态下(当没有指定 + 或–的情况下),该单词可有可无,但含有该单词的行等级较高。这和MATCH() ... AGAINST()不使用IN BOOLEAN MODE修改程序时的运作很类似。

    • > fb0fed43b83fb0652d5f29eaa4ee0614 操作符增强其影响,而 c338afddb723986043c602cf4e852541turnover c89db6444ba704a844ccc22c759faf47 myisamchk --recover --ft_min_word_len=3 tbl_name.MYI

      为保证 myisamchk 及服务器对全文参数使用相同的值, 可将每一项都放在供选文件中的 [mysqld]和 [myisamchk] 部分:

      [mysqld]
      ft_min_word_len=3
      [myisamchk]
      ft_min_word_len=3

      使用 REPAIR TABLE、 ANALYZE TABLE、OPTIMIZE TABLE或ALTER TABLE来代替使用 myisamchk 。这些语句通过服务器来执行,服务器知道使用哪个全文参数值更加合适。

       以上就是MySQL基础教程10 —— 函数之全文搜索功能的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn