full-text
MySQL支持全文索引(Full-Text) 已经很久了,目前,fulltext是一种只适用于MyISAM表的一个索引类型,
而且对定义索引列的数据类型也有限制,只能是以下三种的组合char、 varchar、text。
fulltext可以在创建表的同时就一起定义好,或者在表创建完成之后,通过语句alter table或create index来追加索引,
总之先后的效果是一样的,但是两者的效率却是存在很大差异的,大量的实验证明,对于大数量的表来说,
先加载数据再来定义全文索引的 速度要远远优于在一个已经定义好全文索引的表里面插入大量数据的速度。
一定会问:这是问什么呢?其实,道理很简单,前者只需要一次性对你的索引列表进行操作,排序比较都是在内存中完成,
然后写入硬盘;后者则要一条一条去硬盘中读取索引表然后再进行比较最后写入,自然这样速度就会很慢。
MySQL是 通过match()和against()这两个函数来实现它的全文索引查询的功能。
match()中的字段名称要和fulltext中定义的字段一致,如果采用boolean模式搜索,也允许只包括fulltext中的某个字段,
不需要全部列出。against()中定义的是所要搜索的字符串以及要求数据 库通过哪种模式去执行全文索引的搜索查询。
全文搜索语法:
MATCH (col1, col2,...) AGAINST (expr [search_modifier])
MATCH(title, body)里的字段必须和FULLTEXT(title, body)里的字段一模一样,如果只要单查title或body一个字段,那得另外再建一个FULLTEXT(title)或FULLTEXT(body),也因为如此,MATCH()的字段一定不能跨table
全文搜索语法:
MATCH (col1, col2,...) AGAINST (expr [search_modifier])
MATCH(title, body)里的字段必须和FULLTEXT(title, body)里的字段一模一样,如果只要单查title或body一个字段,那得另外再建一个FULLTEXT(title)或FULLTEXT(body),也因为如此,MATCH()的字段一定不能跨table
三种模式
1.自然语言查找(
IN NATURAL LANGUAGE MODE)。这是mysql默认的全文搜索方式
select id,title FROM post WHERE MATCH(content) AGAINST ('search keyword' IN NATURAL LANGUAGE MODE);
或者
select id,title FROM post WHERE MATCH(content) AGAINST ('search keyword')
expr就是要搜寻的字符串。
没有特殊字符。
套用Stopwords。
剔除一半row以上都有的字,譬如说,每个row都有mysql这个字的话,那用mysql去查时,会找不到任何row,这在row的数量无敌多时很有用,因为把所有row都找出来是没有意义的,这时,mysql几乎被当作是stopword;但是当row只有两笔时,是啥鬼也查不出来的,因为每个字都出现50%以上,要避免这种状况,请用IN BOOLEAN MODE。
2.IN BOOLEAN MODE
expr里有特殊字符辅助特殊的搜寻语法。
IN BOOLEAN MODE的特色:
不剔除50%以上符合的row。
不自动以相关性反向排序。
可以对没有FULLTEXT index的字段进行搜寻,但会非常慢。
限制最长与最短的字符串。
套用Stopwords。
搜寻语法:
+:一定要有。
-:不可以有,但这个「不可以有」指的是在符合的row里不可以有指定的字符串,所以不能只下「-yoursql」这样是查不到任何row的,必须搭配其他语法使用。
:(什么都没)预设用法,表示可有可无,有的话排比较前面,没有的排后面。
>:提高该字的相关性。
<:降低相关性。
( ):条件可以巢状。
+aaa +(>bbb <ccc) // 找到有aaa和bbb,或者aaa和ccc,然后aaa&bbb排在aaa&ccc前面
~:将其相关性由正转负,表示拥有该字会降低相关性,但不像「-」将之排除,只是排在较后面。
*:万用字,不像其他语法放在前面,这个要接在字符串后面。
" ":用双引号将一段句子包起来表示要完全相符,不可拆字。
3.IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION / WITH QUERY EXPANSION
expr里有特殊字符辅助特殊的搜寻语法。
IN BOOLEAN MODE的特色:
不剔除50%以上符合的row。
不自动以相关性反向排序。
可以对没有FULLTEXT index的字段进行搜寻,但会非常慢。
限制最长与最短的字符串。
套用Stopwords。
搜寻语法:
+:一定要有。
-:不可以有,但这个「不可以有」指的是在符合的row里不可以有指定的字符串,所以不能只下「-yoursql」这样是查不到任何row的,必须搭配其他语法使用。
:(什么都没)预设用法,表示可有可无,有的话排比较前面,没有的排后面。
>:提高该字的相关性。
<:降低相关性。
( ):条件可以巢状。
+aaa +(>bbb <ccc) // 找到有aaa和bbb,或者aaa和ccc,然后aaa&bbb排在aaa&ccc前面
~:将其相关性由正转负,表示拥有该字会降低相关性,但不像「-」将之排除,只是排在较后面。
*:万用字,不像其他语法放在前面,这个要接在字符串后面。
" ":用双引号将一段句子包起来表示要完全相符,不可拆字。
3.IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION / WITH QUERY EXPANSION