服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|

mysql全文模糊搜索MATCH AGAINST方法示例

2019-06-17 11:50web窝 Mysql

这篇文章主要介绍了mysql全文模糊搜索MATCH AGAINST方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

mysql 4.x以上提供了全文检索支持 MATCH ……AGAINST 模式(不区分大小写)

建立全文索引的表的存储引擎类型必须为MyISAM

问题是match against对中文模糊搜索支持不是太好

新建一个utf8 MyISAM类型的表并建立一个全文索引 :

CREATE TABLE articles (
  id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
  title VARCHAR(200),
  body TEXT,
  FULLTEXT (title,body)
) ENGINE=MyISAM DEFAULT >

其中FULLTEXT(title, body) 给title和body这两列建立全文索引,之后检索的时候注意必须同时指定这两列。

给这个表添加点测试数据

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 ...');

全文检索测试

SELECT * FROM articles  WHERE MATCH (title,body) AGAINST ('database'); 

注意 MATCH (title,body) 里面的值必须是前面建立全文索引的两个字段不能少。

mysql 默认支持全文检索的字符长度是4,可以用SHOW VARIABLES LIKE 'ft_min_word_len' 来查看指定的字符长度,也可以在mysql配置文件my.ini 更改最小字符长度,方法是在my.ini 增加一行 比如:ft_min_word_len = 2,改完后重启mysql即可。

另外,MySQL还会计算一个词的权值,以决定是否出现在结果集中,具体如下:

mysql在集和查询中的对每个合适的词都会先计算它们的权重,一个出现在多个文档中的词将有较低的权重(可能甚至有一个零权重),因为在这个特定的集中,它有较低的语义值。否则,如果词是较少的,它将得到一个较高的权重,mysql默认的阀值是50%,上面‘you'在每个文档都出现,因此是100%,只有低于50%的才会出现在结果集中。

全文检索语法

SELECT * FROM articles WHERE MATCH (title,body)   AGAINST ('+apple -banana' IN BOOLEAN MODE); 

表示AND,即必须包含。- 表示NOT,即不包含。

SELECT * FROM articles WHERE MATCH (title,body)   AGAINST ('apple banana' IN BOOLEAN MODE); 

apple和banana之间是空格,空格表示OR,即至少包含apple、banana中的一个。

SELECT * FROM articles WHERE MATCH (title,body)   AGAINST ('+apple banana' IN BOOLEAN MODE); 

必须包含apple,但是如果同时也包含banana则会获得更高的权重。

SELECT * FROM articles WHERE MATCH (title,body)   AGAINST ('+apple ~banana' IN BOOLEAN MODE);

 ~ 是我们熟悉的异或运算符。返回的记录必须包含apple,但是如果同时也包含banana会降低权重。 但是它没有 +apple -banana 严格,因为后者如果包含banana压根就不返回。

SELECT * FROM articles WHERE MATCH (title,body)   AGAINST ('+apple +(>banana <orange)' IN BOOLEAN MODE); 

返回同时包含apple和banana或者同时包含apple和orange的记录。但是同时包含apple和banana的记录的权重高于同时包含apple和orange的记录。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

延伸 · 阅读

精彩推荐
  • MysqlCan't connect to local MySQL through socket '/tmp/mysql.sock'解决方法

    Can't connect to local MySQL through socket '/tmp/mysql.sock'解决方法

    今天小编就为大家分享一篇关于Can't connect to local MySQL through socket '/tmp/mysql.sock'解决方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    芽孢八叠球菌 144 2019-06-02
  • MysqlMySQL在线DDL gh-ost使用总结

    MySQL在线DDL gh-ost使用总结

    在本篇内容里小编给大家整理了关于MySQL在线DDL gh-ost使用方法和相关知识点,需要的朋友们学习下。...

    jyzhou 379 2019-06-05
  • MysqlSQL和NoSQL之间的区别总结

    SQL和NoSQL之间的区别总结

    在本篇内容里我们给大家精选了关于SQL和NoSQL之间的区别的总结内容,对此有需要的朋友们跟着学习下。...

    laozhang 335 2019-06-07
  • MysqlMySQL服务器的SSD性能问题分析和测试详解

    MySQL服务器的SSD性能问题分析和测试详解

    这篇文章主要给大家介绍了关于MySQL服务器的SSD性能问题分析和测试的相关资料,文中图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...

    wangdong 365 2019-06-16
  • Mysql深入理解MySQL主从复制线程状态转变

    深入理解MySQL主从复制线程状态转变

    这篇文章主要给大家介绍了关于MySQL主从复制线程状态转变的相关资料,文中介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...

    彭东稳 235 2019-06-06
  • Mysqlmysql事务select for update及数据的一致性处理讲解

    mysql事务select for update及数据的一致性处理讲解

    今天小编就为大家分享一篇关于mysql事务select for update及数据的一致性处理讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    CODETC 341 2019-06-01
  • MysqlMysql的MERGE存储引擎详解

    Mysql的MERGE存储引擎详解

    在本文里我们给大家整理了关于Mysql的MERGE存储引擎的相关知识点内容,有需要的读者们学习下。...

    laozhang 370 2019-06-06
  • MysqlMySQL内存使用的查看方式详解

    MySQL内存使用的查看方式详解

    MySQL中内存分为全局内存和线程内存两大部分(其实并不全部,只是影响比较大的 部分),下面这篇文章主要给大家介绍了关于MySQL内存使用的查看方式,文中通过示例代码介绍的非常详细,需要的朋友可以参考下...

    xuanm 246 2019-06-10