X
活动推荐

爆款高性能云主机2折293元/年

企业级性能云服务器限时2折起
查看详情 293元/年
阅读模式:

mysql全文索引fulltext index

查看:3176  回复:4  类型:  来源:php自学网  标签 mysql 索引

1.简述

        通过建立mysql的全文索引进行全文搜索的功能。全文搜索可以同时搜索多个列中的多个关键字的记录结果。

        虽然like语句也能达到同样的效果,但使用全文索引效率更高,代码更简洁。

        在MySQL5.6.24以后的版本中InnoDB和MyISAM引擎搜支持全文搜索,比MySQL5.6.24低的版本只有MyISAM引擎支持全文搜索。

        mysql默认不支持中文词的搜索。

        mysql建立全文搜索的字段类型必须是char、varchar和text。

2.建立和删除全文索引

#建表的时候添加全文索引
CREATE TABLE news ( 
    id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    title VARCHAR(200), 
    content TEXT, 
    FULLTEXT(title,content) 
)TYPE=MYISAM;
#在已建好的表上添加全文索引
ALTER TABLE `news` ADD FULLTEXT(title);#单个字段
ALTER TABLE `news` ADD FULLTEXT(title,content);#多个字段
#索引的删除
ALTER TABLE `news` DROP INDEX title;
#查看表的所有索引
SHOW INDEX FROM `news`;

3.sql查询语句

#单字段搜索
SELECT * FROM `news` WHERE MATCH(`字段`) AGAINST('关键词');
#多字段搜索
SELECT * FROM `news` WHERE MATCH(`字段`,`字段2`) AGAINST('关键词1 关键词2');

4.检索方式


     4.1、自然语言检索: IN NATURAL LANGUAGE MODE

     4.2、布尔检索: IN BOOLEAN MODE
          剔除一半匹配行以上都有的词,譬如说,每个行都有this这个字的话,那用this去查时,会找不到任何结果,这在记录条数特别多时很有用,
          原因是数据库认为把所有行都找出来是没有意义的,这时,this几乎被当作是stopword(中断词);但是若只有两行记录时,是啥鬼也查不出来的,
          因为每个字都出现50%(或以上),要避免这种状况,请用IN BOOLEAN MODE。

       ● IN BOOLEAN MODE的特色:
          ·不剔除50%以上符合的row。
          ·不自动以相关性反向排序。
          ·可以对没有FULLTEXT index的字段进行搜寻,但会非常慢。
          ·限制最长与最短的字符串。
          ·套用Stopwords。
 
       ● 搜索语法规则:
         +   一定要有(不含有该关键词的数据条均被忽略)。
         -   不可以有(排除指定关键词,含有该关键词的均被忽略)。
         >   提高该条匹配数据的权重值。
         <   降低该条匹配数据的权重值。
         ~   将其相关性由正转负,表示拥有该字会降低相关性(但不像 - 将之排除),只是排在较后面权重值降低。
         *   万用字,不像其他语法放在前面,这个要接在字符串后面。
         " " 用双引号将一段句子包起来表示要完全相符,不可拆字。

         SELECT * FROM news WHERE MATCH (title,content) AGAINST ('+apple -banana' IN BOOLEAN MODE);
         + 表示AND,即必须包含。- 表示NOT,即必须不包含。即:返回记录必需包含 apple,且不能包含 banner。

         SELECT * FROM news WHERE MATCH (title,content) AGAINST ('apple banana' IN BOOLEAN MODE);
         apple和banana之间是空格,空格表示OR。即:返回记录至少包含apple、banana中的一个。

         SELECT * FROM news WHERE MATCH (title,content) AGAINST ('+apple banana' IN BOOLEAN MODE);
         返回记录必须包含apple,同时banana可包含也可不包含,若包含的话会获得更高的权重。

         SELECT * FROM news WHERE MATCH (title,content) AGAINST ('+apple ~banana' IN BOOLEAN MODE);
         ~ 是我们熟悉的异或运算符。返回记录必须包含apple,若也包含了banana会降低权重。
         但是它没有 +apple -banana 严格,因为后者如果包含banana压根就不返回。

         SELECT * FROM news WHERE MATCH (title,content) AGAINST ('+apple +(>banana <orange)' IN BOOLEAN MODE);
         返回必须同时包含“apple banana”或者必须同时包含“apple orange”的记录。
         若同时包含“apple banana”和“apple orange”的记录,则“apple banana”的权重高于“apple orange”的权重。

    4.3、查询扩展检索: WITH QUERY EXPANSION



分享到:
0 0

*有问题之处烦请在评论中指出非常感谢!
不是我想要的内容,继续搜索:

扫描二维码手机查看

最新评论:
OLG-余祥伟  发表于 2017-09-22 11:31:50  中国广东深圳
沙发
http://imysqldba.blog.51cto.com/1222376/1618487 回复
OLG-余祥伟 回复 OLG-余祥伟 对于刚使用mysql全文索引搜索的童鞋,第一个疑惑可能就是,为什么我搜索xx结果不显示呢?明明我数据里面有。这个问题有很多种原因,其中最常见的就是ft_min_word_len(最小搜索长度)导致的。
2017-09-22 11:32 中国广东深圳 回复
站长 回复 OLG-余祥伟 全英文没事,有中文的词设置ft_min_word_len()会好点点,中文分词最好还是用讯搜
2017-09-22 12:09 中国广东深圳 回复
OLG-余祥伟  发表于 2017-09-22 11:35:33  中国广东深圳
板凳
create 语句后面的TYPE=MyISAM<br /> TYPE=MyISAM 和 ENGINE=MyISAM 都是设置数据库存储引擎的语句 ,(老版本的MySQL使用TYPE而不是ENGINE(例如,TYPE = MYISAM)。 MySQL 5.1为向下兼容而支持这个语法,但TYPE现在被轻视,而ENGINE是首先的用法。 一般地,ENGINE 选项是不必要的;除非默认已经被改变了,MyISAM是默认存储引擎。<br /> 所以直接将原来TYPE=MyISAM 改成ENGINE=MyISAM 就可以了 回复
回复:[主题]
表情:
 提交评论
清空

发布评论:


登录:
  表情:
评论话题
推荐阅读:
centos 7 安装 mysql-5.7   阅读:4326简单的DOS攻击之死亡之ping详解   阅读:28604php打印九九加法表   阅读:6436小米手机端商城rem适配原理   阅读:5224程序员找工作三要素(必看)   阅读:4019用php从1乘到100的值   阅读:4513php打印三角形   阅读:3311phpexcel 超简单从数据库一键导出数据到excel教程   阅读:5316nginx编译安装后对nginx进行平滑升级   阅读:3525mysql的四种索引类型   阅读:12427centos 7 安装 mysql-5.7   阅读:4326linux教程,鸟哥私房菜(pdf全集)   阅读:5134php+redis实现消息队列   阅读:8046linux时间戳有趣的情人节秒1234567890   阅读:3693给 centos 7 安装桌面环境   阅读:13961mysql5.7开启sql日志的配置   阅读:6017面试都会问你为什么你从上一家公司离职的真实意思   阅读:7722nginx编译安装后对nginx进行平滑升级   阅读:3525centos7开启交换内存   阅读:7243ajax+php 实现一个简单的在线聊天室功能(附带源码)   阅读:6297mysql 为什么添加索引可以提高访问速度   阅读:4235centos7.3安装mongodb3.6   阅读:5001centos 7 添加 redis 3.2.9 开机启动脚本   阅读:6686phpexcel 超简单从数据库一键导出数据到excel教程   阅读:5316centos 7 修改系统屏幕分辨率   阅读:30747centos7中颁发CA证书并开启web https   阅读:2855centos 7 安装 nginx-1.11.10   阅读:6046linux rarcrack破解rar、zip和7z压缩包简单密码的工具   阅读:9555栈和堆的区别   阅读:3268php 生成图片,给图片加水印   阅读:4112ajax+php 实现一个简单的在线聊天室功能(附带源码)   阅读:6297TCP的三次握手(建立连接)和四次挥手(关闭连接)   阅读:1351纯干货,程序员面试的超实用技巧   阅读:2716web性能测试工具ab的测试方法   阅读:3314知乎百万赞作者告诉你:年薪百万的人都在靠什么赚钱   阅读:4075php 生成图片,给图片加水印   阅读:4112mysql数据一键导出到csv文件   阅读:3906关于PHP程序员技术职业生涯规划   阅读:1077mysql5.7主从同步中binlog同步模式详解   阅读:2388简单的DOS攻击之死亡之ping详解   阅读:28604mysql5.7主从同步中binlog同步模式详解   阅读:2388十张GIF让你弄懂递归等概念   阅读:4080什么是天使轮?什么是A轮融资?B轮融资?   阅读:2537centos 7 安装 samba 服务   阅读:4551纯干货,程序员面试的超实用技巧   阅读:2716移动端js触摸touch详解(附带案例源码)   阅读:11448centos 7.2 添加php7 的 php-fpm 开机启动   阅读:16679十张GIF让你弄懂递归等概念   阅读:4080php 读取和设置redis的键值   阅读:5434web性能测试工具ab的测试方法   阅读:3314