示例
select * from article where MATCH(title) AGAINST ('北京旅游' IN NATURAL LANGUAGE MODE); // 不指定模式,默认使用自然语言模式 select * from article where MATCH(title) AGAINST ('北京旅游');
可以看出,该模式下根据“北京旅游”搜索,可以搜索出包含“北京”的或者包含“旅游”的内容,因为它是根据自然语言分成了两个关键词。
上面示例中返回的结果会自动按照匹配度排序,匹配度高的在前面,匹配度是一个非负浮点数。
示例
// 查看匹配度 select * , MATCH(title) AGAINST ('北京旅游') as score from article where MATCH(title) AGAINST ('北京旅游' IN NATURAL LANGUAGE MODE);
2、布尔检索(BOOLEAN MODE)
布尔检索模式可以使用操作符,可以支持指定关键词必须出现或者必须不能出现或者关键词的权重高还是低等复杂查询。
示例
// 无操作符 // 包含“约会”或“攻略” select * from article where MATCH(title) AGAINST ('约会 攻略' IN BOOLEAN MODE);
// 使用操作符 // 必须包含“约会”,可包含“攻略” select * from article where MATCH(title) AGAINST ('+约会 攻略' IN BOOLEAN MODE);
更多操作符示例:
'约会 攻略' 无操作符,表示或,要么包含“约会”,要么包含“攻略” '+约会 +攻略' 必须同时包含两个词 '+约会 攻略' 必须包含“约会”,但是如果也包含“攻略”的话,匹配度更高。 '+约会 -攻略' 必须包含“约会”,同时不能包含“攻略”。 '+约会 ~攻略' 必须包含“约会”,但是如果也包含“攻略”的话,匹配度要比不包含“攻略”的记录低。 '+约会 +(>攻略 <技巧)' 查询必须包含“约会”和“攻略”或者“约会”和“技巧”的记录,但是“约会 攻略”的匹配度要比“约会 技巧”高。 '约会*' 查询包含以“约会”开头的记录。 '"约会攻略"' 使用双引号把要搜素的词括起来,效果类似于like '%约会攻略%', 例如“约会攻略初级篇”会被匹配到,而“约会的攻略”就不会被匹配。
与 Like 对比
全文索引和 like 查询对比,有以下优点:
- like 只是进行模糊匹配,全文索引却提供了一些语法语义的查询功能,会将要查的字符串进行分词操作,这决定于 Mysql 的词库。
- 全文索引可以自己设置词语的最小、最大长度,要忽略的词,这些都是可以设置的。
- 用全文索引去某个列查一个字符串,会返回匹配度,可以理解为匹配的关键字个数,是个浮点数。
而且全文检索的性能也是优于 like 查询的
以下是以 50w 左右数据进行的测试:
// like 查询 select * from article where title like '%北京%';
// 全文索引查询 select * from article where MATCH(title) AGAINST ('北京' IN BOOLEAN MODE);
可以看出 like 查询是 1.536s,全文索引查询是 0.094s,快了16倍左右。
总结
全文索引能快速搜索,但是也存在维护索引的开销。字段长度越大,创建的全文索引也越大,会影响DML语句的吞吐量。数据量不大的情况下可以采用全文索引来做搜索,简单方便,但是数据量大的话还是建议用专门的搜索引擎 ElasticSearch 来做这件事。
到此这篇关于Mysql实现简易版搜索引擎的示例代码的文章就介绍到这了,更多相关Mysql 搜索引擎内容请搜索
更多Mysql内容来自木庄网络博客
标签:Mysql
相关阅读 >>
更多相关阅读请进入《mysql》频道 >>

数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。