测试全文查询结果
在这一步中,我们将测试并优化全文查询,以确保它们能返回预期的结果。我们会尝试不同的搜索词和布尔运算符,以实现尽可能高的搜索准确性。
首先,确保你已连接到 MySQL 服务器并使用 search_db
数据库。如果你关闭了连接,请使用以下命令重新连接:
mysql -u root -p
系统提示时输入 root 密码。然后,选择数据库:
USE search_db;
让我们先查看 articles
表中的数据:
SELECT * FROM articles;
这将显示表的当前内容:
+----+--------------------------+---------------------------------------------------------------------+
| id | title | content |
+----+--------------------------+---------------------------------------------------------------------+
| 1 | MySQL Full-Text Search | This article explains how to use full-text search in MySQL. |
| 2 | Indexing in MySQL | Learn about different types of indexes in MySQL, including full-text indexes. |
| 3 | Optimizing MySQL Queries | Tips and tricks for optimizing your MySQL queries for better performance. |
+----+--------------------------+---------------------------------------------------------------------+
3 rows in set (0.00 sec)
现在,让我们尝试一个更复杂的布尔查询。假设我们要查找包含 "MySQL" 以及 "indexing" 或 "optimizing" 的文章。我们可以使用括号对可选术语进行分组来实现这一点:
SELECT * FROM articles WHERE MATCH (title, content) AGAINST ('+MySQL +(indexing optimizing)' IN BOOLEAN MODE);
此查询要求包含 "MySQL",并且要求包含 "indexing" 或 "optimizing" 中的任意一个。
输出将是:
+----+--------------------------+---------------------------------------------------------------------+
| id | title | content |
+----+--------------------------+---------------------------------------------------------------------+
| 2 | Indexing in MySQL | Learn about different types of indexes in MySQL, including full-text indexes. |
| 3 | Optimizing MySQL Queries | Tips and tricks for optimizing your MySQL queries for better performance. |
+----+--------------------------+---------------------------------------------------------------------+
2 rows in set (0.00 sec)
第 1 篇文章被排除在外,因为它只包含 "MySQL",而不包含 "indexing" 或 "optimizing"。
让我们尝试另一种情况。假设我们要查找关于 "MySQL" 但特别 不 关于 "queries" 的文章。
SELECT * FROM articles WHERE MATCH (title, content) AGAINST ('+MySQL -queries' IN BOOLEAN MODE);
此查询要求包含 "MySQL",并排除包含 "queries" 的文章。
输出将是:
+----+------------------------+---------------------------------------------------------------------+
| id | title | content |
+----+------------------------+---------------------------------------------------------------------+
| 1 | MySQL Full-Text Search | This article explains how to use full-text search in MySQL. |
| 2 | Indexing in MySQL | Learn about different types of indexes in MySQL, including full-text indexes. |
+----+------------------------+---------------------------------------------------------------------+
2 rows in set (0.00 sec)
关于 "MySQL Queries" 的第 3 篇文章被排除在外。
现在,让我们尝试对结果进行排序。我们可以使用 >
和 <
运算符来影响相关性得分。假设我们要查找关于 "MySQL" 的文章,但我们希望优先显示也提到 "indexing" 的文章:
SELECT id, title, content, MATCH (title, content) AGAINST ('+MySQL >indexing' IN BOOLEAN MODE) AS relevance FROM articles WHERE MATCH (title, content) AGAINST ('+MySQL >indexing' IN BOOLEAN MODE) ORDER BY relevance DESC;
此查询要求包含 "MySQL",并提高包含 "indexing" 的文章的相关性。然后,结果将按相关性降序排列。
输出将是:
+----+--------------------------+---------------------------------------------------------------------+-----------+
| id | title | content | relevance |
+----+--------------------------+---------------------------------------------------------------------+-----------+
| 2 | Indexing in MySQL | Learn about different types of indexes in MySQL, including full-text indexes. | 1.6931 |
| 1 | MySQL Full-Text Search | This article explains how to use full-text search in MySQL. | 0.3068 |
| 3 | Optimizing MySQL Queries | Tips and tricks for optimizing your MySQL queries for better performance. | 0.3068 |
+----+--------------------------+---------------------------------------------------------------------+-----------+
3 rows in set (0.00 sec)
注意,"Indexing in MySQL" 文章现在排在第一位,因为由于 >indexing
条件,它的相关性得分更高。
通过尝试不同的搜索词和布尔运算符,你可以微调全文查询以获得预期的结果。请记住,始终要彻底测试你的查询,以确保它们按预期工作。
至此,关于 MySQL 全文搜索的实验就结束了。你已经学习了如何添加全文索引、使用 MATCH AGAINST
执行基本搜索、使用布尔模式进行高级搜索,以及测试查询结果。