# 12.10.3 带有查询扩展的全文搜索

全文搜索支持查询扩展(特别是其变体“盲查询扩展”)。当搜索短语太短时,这通常很有用,这通常意味着用户依赖于全文搜索引擎缺乏的隐含知识。例如,用户搜索“database”可能实际上意味着“MySQL”、“Oracle”、“DB2”和“RDBMS”都是应该匹配“databases”并且也应该返回的短语。这是隐含的知识。

通过添加启用盲查询扩展(也称为自动相关性反馈)使用查询扩展要么在带有查询扩展的自然语言模式下跟随搜索词组。它通过执行两次搜索来工作,其中第二次搜索的搜索短语是原始搜索短语与第一次搜索中最相关的少数文档相连接。因此,如果这些文档之一包含单词“databases”和单词“MySQL”,则第二次搜索会找到包含单词“MySQL”的文档,即使它们不包含单词“database”。以下示例显示了这种差异:

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

mysql> SELECT * FROM articles
    WHERE MATCH (title,body)
    AGAINST ('database' WITH QUERY EXPANSION);
+----+-----------------------+------------------------------------------+
| id | title                 | body                                     |
+----+-----------------------+------------------------------------------+
|  5 | MySQL vs. YourSQL     | In the following database comparison ... |
|  1 | MySQL Tutorial        | DBMS stands for DataBase ...             |
|  3 | Optimizing MySQL      | In this tutorial we show ...             |
|  6 | MySQL Security        | When configured properly, MySQL ...      |
|  2 | How To Use MySQL Well | After you went through a ...             |
|  4 | 1001 MySQL Tricks     | 1. Never run mysqld as root. 2. ...      |
+----+-----------------------+------------------------------------------+
6 rows in set (0.00 sec)

另一个例子是搜索 Georges Simenon 关于 Maigret 的书籍,当用户不确定如何拼写“Maigret”时。搜索“Megre and the reluctant Witnesses”只会找到“Maigret and the Reluctant Witnesses”,而没有查询扩展。带有查询扩展的搜索在第二遍查找所有带有单词“Maigret”的书籍。

笔记

因为盲目查询扩展往往会通过返回不相关的文档来显着增加噪音,所以只有在搜索短语很短时才使用它。