在MySQL中,MATCH……AGAINST是全文索引(Full-Text index)的查询语法,它允许你对文本进行高效的全文搜素,支持自然语言搜索和布尔搜索模式。以下是MATCH……AGAINST的详细用法和示例
一、全文索引的基本概念
- 全文索引适用于CHAR、VARCHAR和TEXT类型的列
- 全文索引支持自然语言搜索和布尔搜索
- 全文索引只能用于MyISAM和InnoDB存储引擎(MySQL5.6及以上版本支持InnoDB的全文索引)
二、创建全文索引
在需要使用全文索引的列上创建全文索引
示例:
1 2 3 4 5 6 | CREATE TABLE articles ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR (255) NOT NULL , content TEXT NOT NULL , FULLTEXT (title, content) -- 在title和content列上创建全文索引 ); |
三、自然语言搜索
自然语言搜索是全文索引的默认模式。它会根据搜索词的相关性返回结果
1 2 | SELECT * FROM table_name WHERE MATCH(column1, column2, ...) AGAINST( 'search_term' ); |
示例:
1 2 3 4 5 6 7 8 9 | -- 插入数据 INSERT INTO articles (title, content) VALUES ( 'MySQL Tutorial' , 'This is a tutorial about MySQL.' ), ( 'Advanced MySQL' , 'Learn advanced techniques in MySQL.' ), ( 'PostgreSQL vs MySQL' , 'A comparison between PostgreSQL and MySQL.' ); -- 自然语言搜索 SELECT * FROM articles WHERE MATCH(title, content) AGAINST( 'MySQL' ); |
- 结果:
- 返回包含MySQL的记录,并按相关性排序
- 相关性得分可以通过MATCH……AGAINST的结果获取:
1 2 3 | SELECT id, title, MATCH(title, content) AGAINST( 'MySQL' ) AS score FROM articles WHERE MATCH(title, content) AGAINST( 'MySQL' ); |
四、布尔搜索
布尔搜素允许使用特定的操作符来精确控制搜索行为
语法:
1 2 | SELECT * FROM table_name WHERE MATCH(column1, column2, ...) AGAINST( 'search_term' IN BOOLEAN MODE); |
常用操作符:
-
+
:必须包含该词。 -
-
:必须不包含该词。 -
*
:通配符,匹配以指定词开头的词。 -
""
:短语搜索,匹配完整短语。 -
()
:分组操作符。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | -- 必须包含MySQL,且不包含PostgreSQL SELECT * FROM articles WHERE MATCH(title, content) AGAINST( '+MySQL -PostgreSQL' IN BOOLEAN MODE); -- 包含MySQL或PostgreSQL SELECT * FROM articles WHERE MATCH(title, content) AGAINST( 'MySQL PostgreSQL' IN BOOLEAN MODE); -- 包含以My开头的词 SELECT * FROM articles WHERE MATCH(title, content) AGAINST( 'My*' IN BOOLEAN MODE); -- 包含完整短语"MySQL Tutorial" SELECT * FROM articles WHERE MATCH(title, content) AGAINST( '"MySQL Tutorial"' IN BOOLEAN MODE); |
五、相关性排序
全文索引会为每条记录计算一个相关性得分(Relevance Score),可以根据得分对结果进行排序。
示例:
1 2 3 4 | SELECT id, title, MATCH(title, content) AGAINST( 'MySQL' ) AS score FROM articles WHERE MATCH(title, content) AGAINST( 'MySQL' ) ORDER BY score DESC ; |
六、全文索引的限制
- 最小词长度:默认情况下,MySQL全文索引会忽略长度小于4的词。可以通过修改ft_min_word_len(MyISAM)或innodb_ft_min_token_size(InnoDB)参数调整
-
停用词:全文索引会忽略常见的停用词(如
the
、and
等)。可以通过修改ft_stopword_file
参数自定义停用词列表。 -
中文支持:MySQL的全文索引对中文支持较差,通常需要配合分词工具(如
ngram
)使用。
七、 配置全文索引
修改最小词长度:
1 2 3 4 5 | -- 查看当前配置 SHOW VARIABLES LIKE 'innodb_ft_min_token_size' ; -- 修改配置(需要重启MySQL) SET GLOBAL innodb_ft_min_token_size = 2; |
使用ngram
分词器(支持中文):
1 2 3 4 5 6 7 8 9 10 11 | -- 创建表时指定ngram分词器 CREATE TABLE articles ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR (255) NOT NULL , content TEXT NOT NULL , FULLTEXT (title, content) WITH PARSER ngram ); -- 查询时使用ngram分词器 SELECT * FROM articles WHERE MATCH(title, content) AGAINST( '关键词' IN BOOLEAN MODE); |
八、 删除全文索引
如果需要删除全文索引,可以使用以下语法:
1 | ALTER TABLE table_name DROP INDEX index_name; |
示例:
1 | ALTER TABLE articles DROP INDEX title; |
九. 全文索引的性能优化
- 索引列选择:只为需要搜索的列创建全文索引,避免不必要的索引开销。
-
分词器选择:对于中文搜索,使用
ngram
分词器。 - 缓存结果:对于高频查询,可以将结果缓存到Redis等缓存系统中。
到此这篇关于MySql match against工具详细用法的文章就介绍到这了,更多相关mysql match against工具内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!