mysql myisam 全文检索_mysql全文索引

mysql通过数值比较,范围查找可以满足大多数查询需要,但是如果需要通过关键词匹配进行过滤的话,就需要一种基于相似度的查询,全文索引就是为这种方式设计的。

全文索引最常用的地方就是搜索引擎,虽然这类搜索引擎背后通常都不是关系型数据库,但是原理一致。在mysql5.6之前,只有myisam引擎支持全文索引,不过5.6版本之后innodb就会支持全文索引。所以以下都是基于myisam引擎的全文索引介绍。

myisam全文索引的对象是一个“全文集合”,这也许是数据表中的某一列或多列数据,具体就是将一条数据被索引的所有列拼接成一个字符串,然后进行索引。

myisam的全文索引分为两层,第一层是关键字,第二层是每个关键字对应的“文档指针”,全文索引并不会使用文档对象的所有词语,它会根据规则过滤掉部分词语,过滤规则有:

1、停用词列表的词不会被索引,默认根据通用英语设置,也可以使用参数ft_stopword_file指定一个外部文件来定义停用词。

2、会过滤掉单词长度大于ft_min_word_len和小于ft_max_word_len的词

自然语言索引:

select id,title,right(body,25) match(title, body) against(‘factory casualties’) as relevance from posts where match(title, body) against (‘factory casualties’);

上面的sql语句会在title,body字段中查找匹配factory 和 casualties的数据, relevance作文查询结果的相关性输出。和普通查询有所不同的是,这类查询会自动根据相关性进行排序。

同一个sql语句只要不是在子句中出现match关键词,其他地方对此出现match不会有额外的消耗。

布尔全文索引:

当编写布尔全文索引时,可以在关键词前加前缀修饰符来定制搜索。

前面自然语言搜索的sql会匹配即包含factory又包含casualties的数据,如果我们想要得到必须满足同时包含这两个词的结果,sql如下:

select id, title, right(body,25) from posts where match(title,body) against(‘+factory +casualties’ in boolean mode);

你可能感兴趣的:(mysql,myisam,全文检索)