Mysql 简单实现全文检索(FULLTEXT)

版本支持

MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引;

MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引;

只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引。

按顺序操做:

1.修改数据库配置

etc/my.cnf 文件 [mysqld] 下面加入

ngram_token_size=1  //支持中文 日文 韩文检索 没配置这个不能使用中文检索
innodb_ft_min_token_size = 1  //InnoDB 检索单位配置
ft_min_word_len = 1   //MyISAM  检索单位配置

1表示以 一个字符隔开检索  如 : 关键字'abc' 会分割成 a b c 分别去匹配

如果为2的话 是这样分割匹配的 ab bc

2.配置完重启下mysql

3.执行sql创建索引

给goods表的name字段 创建一个解析器为ngram 名称为full_index_name 的fulltext索引

CREATE FULLTEXT INDEX full_index_name ON goods(name) WITH PARSER `ngram`;

4.查询

自然语言的全文索引(默认)
//score表示相关性评分 默认排序是评分倒序

//key是关键词


select *,(MATCH ( `name`  ) AGAINST ( 'key' )  )AS score
from goods
where MATCH(name) AGAINST('key' ) ;

布尔全文索引(可以见一些复杂写的限制条件检索 实现更精准的查询)

在布尔搜索中,我们可以在查询中自定义某个被搜索的词语的相关性,当编写一个布尔搜索查询时,可以通过一些前缀修饰符来定制搜索。

  1. + 必须包含该词

  2. - 必须不包含该词

  3. > 提高该词的相关性,查询的结果靠前

  4. < 降低该词的相关性,查询的结果靠后

  5. (*)星号 通配符,只能接在词后面

 

# 必须每个词都有匹配

例如
select *  ,(MATCH ( `name`  ) AGAINST ( 'key' )  )AS score
from goods
where MATCH(title) AGAINST('+key' IN BOOLEAN MODE) order by score Desc;

完成.

备注 :MySQL ngram全文解析器简介

MySQL内置的全文解析器使用空格确定单词的开始和结束。当涉及汉语,日语或韩语等表意语言语言时,这是一个限制,因为这些语言不使用分词符。

为了解决这个问题,MySQL提供了ngram全文解析器。自MySQL5.7.6版起,MySQL将ngram全文解析器作为内置的服务器插件,这意味着当MySQL数据库服务器启动时,MySQL会自动加载该插件。 MySQL支持用于InnoDBMyISAM存储引擎的ngram全文解析器。

根据定义,ngram是来自文本序列的多个字符的连续序列。 ngram全文解析器的主要功能是将文本序列标记为n个字符的连续序列。
 

文档上说 MySQL5.7.6之后的版本才支持ngram全文解析器 我使用的5.7.3版本的mysql 亲测是可以实现的

你可能感兴趣的:(Mysql,mysql,数据库)