赞
踩
简介
它能够利用【分词技术】等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。
select * fromarticle where content like ‘%xxx%’;
这种写法查询效率非常低。全文索引就是为了高效的解决这种问题产生的。
全文索引,以前只有MyISAM引擎支持。
Mysql5.6后开始默认使用InnoDb引擎,并且5.6.4版本后的InnoDb引擎开始支持全文索引。
目前只有 CHAR、VARCHAR 、TEXT 列上可以创建全文索引。
在MySQL 5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分词器把中文段落预处理拆分成单词,然后存入数据库。
从MySQL 5.7.6开始,MySQL内置了ngram全文解析器,用来支持中文、日文、韩文分词。
汇总支持情况:
MyISAM引擎
5.6.4版本后的InnoDb引擎
5.7.6之前,全文索引只支持英文全文索引
从MySQL 5.7.6开始支持中文、日文、韩文分词
注意:在数据量较大时候,我们应该先将数据放入一个没有全局索引的表中,然后再用CREATE index创建fulltext索引,要比先为一张表建立fulltext然后再将数据写入的查询速度快。
用法
My.ini参数配置
ngram_token_size=2 #中文按2个文字切词,进行全文索引
配置完重启
创建full text索引
ALTER TABLEarticle ADD FULLTEXT INDEX article_fulltext (title,content) with parser ngram;
或者
CREATE FULLTEXTINDEX idx ON table_name(`columns`) with parser ngram;
说明:
-(title,content)表示在title和content两列上加联合索引,如果有多列,用","分隔即可;
- 创建索引语句最后一定要加上with parser ngram
ngram解析器
如果要支持中文分词进行中文全文检索,在创建索引时必须用ngram解析器。
ngram解析器简单说明
内置的MySQL全文解析器使用空格确定单词的开头和结尾。
从版本5.7.6开始,MySQL包含ngram全文解析器作为内置服务器插件,要使用ngram解析器,需要在创建full text索引时加上 with parser ngram 。
根据ngram_token_size参数,ngram按参数值对搜索词进行分词。
查询
mysql全文搜索有三种模式:
自然语言查找
这是mysql默认的全文搜索方式
SELECT * FROM article WHERE MATCH(title,content) AGAINST ('查询字符串');
或者显式声明使用自然语言搜索方式
SELECT * FROM articles
WHERE MATCH (title,body)
AGAINST ('database' INNATURAL LANGUAGE MODE);
由于自然语言搜索方式是默认模式,所以可以省略声明模式的“IN NATURALLANGUAGE MODE”部分。
自然语言搜索模式的么特点:
1.忽略停词(stopword),英语中频繁出现的and/or/to等词被认为是没有实际搜索的意义,搜索这些不会获得任何结果。
2.如果某个词在数据集中频繁出现的几率超过了50%,也会被认为是停词,所以如果数据库中只有一行数据,不管你怎么全文搜索都不能获得结果。
3.搜索结果都具有一个相关度的数据,返回结果自动按相关度由高到低排列。
4.只针对独立的单词进行检索,而不考虑单词的局部匹配,如搜索box时,就不会将boxing作为检索目标。
布尔查找。
这种查找方式的特点是没有自然查找模式中的50%规则,即便有词语在数据集中频繁出现的几率超过50%,也会被作为搜索目标进行检索并返回结果,而且检索时单词的局部匹配也会被作为目标进行检索。sql示例select id,title FROM post WHERE MATCH(content) AGAINST ('searchkeyword' IN BOOLEAN MODE)
带子查询扩展的自然语言查找
select id,title FROM post WHERE MATCH(content) AGAINST ('searchkeyword' IN BOOLEAN MODE WITH EXPANSION)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。