一,首先我們來了解一下其他幾個知識點:
1. Mysql的索引意義?
索引是加快訪問表內容的基本手段,尤其是在涉及多個表的關聯查詢里。當然,索引可以加快檢索速度,但是它也同時降低了索引列的插入,刪除和更新值的速度。
換通俗的話來講:
mysql中的索引就是一個特殊的平衡二叉樹,當在平衡二叉樹中搜索某一條值的時候,上億條的數據可以在十多次內可以塞選出來。
所以,每個數據表里面有多少個索引就有多少個對應的索引表。
當然,一個表里面的索引越多寫入速度會越慢,但讀去速度會越。
mysql的索引類型:
唯一索引。
常規索引。
fulltext索引
spatial索引
hash索引
2. 什么fulltext索引?
fulltext索引也叫做全文本索引,MySQL具備全文搜索的能力,它可以讓你在不使用模板匹配操作的情況下進行單詞或短語的查找。
ps:(個人理解)
1. mysql的全文本索引是針對與英文文本的索引(畢竟是別人國外人開發的mysql),我們知道在一篇英文文章中可以發現一個特點,每個單詞與每個單詞都是以空格隔開的。如果我們把每個單詞看做一個數據,按照單詞的大小來進行前后排列,也可以形成一個二叉樹。
2. 有規律可循,有二叉樹,我們就可以對其快速搜索,並可以對應進行封裝成索引,也就是我們所說的全文本索引————fulltext索引。
3. 注意————fulltext索引只能搜索英文。
二,使用FULLTEXT搜索
1. 全文搜索的特性(重點)
全文搜索基於fulltext索引。fulltext索引,只能出現在char varchar text這幾種類型的表字段里面。
全文搜索會忽略那些常見詞:常見詞,指的是至少一半的行里都出現過,超過50%的詞,都為常見詞;
有些為內建的常用單詞:也叫停用詞,比如:the/after,other
比較短的單詞也會被停用。
單詞的定義:它們是由字母,數字,撇號和下划線,構造而成的字符串。(英文單詞完全符合,但是中文不行)
可以為一個字段(列)創建fulltext索引,也可以為多個字段(列)創建一個fulltext索引。
注意:一個索引是一個平衡二叉樹。
1. 如果給a字段建立一個索引,當進行全文本搜索時候,只要命中a字段即可完成搜索。
2. 如果為a和b兩個字段同時建立一個fulltext索引時,它的平衡二叉樹里面是包括這兩個字段的所有數據。如果此刻,我們只想對a字段進行全文本搜索,這個fulltext是做不到的,只能另外在建立一個a字段的fulltext索引。
2全文搜索分類
自然語言搜索(默認類型):mysql會把搜索的字符串解析成一系列的單詞,然后去搜索出包含這些單詞的那些行;
布爾模式搜索:可以為搜索的字符串里加修飾詞,用於表明某些特定的要求,比如匹配行里必須出現某些單詞,而且必須按照規定順序出現,或者不能存在某些單詞等。
查詢擴展搜索:這種搜索分為兩個階段。第一階段,是自然語言搜素。第二階段,則先把原來的搜索字符串,與第一階段的搜索里高度匹配的那些行,連接到一起,在一次進行全文本搜索。
3 mysql語法:
建立索引語法:
建表
create table article (title varchar(40),contain text ) engine = myisam;
建立三個索引
alter table article
add fulltext (title),
add fulltext (contain),
add fulltext (title, contain);
4. 自然語言索引
命中title這個fulltext索引,並搜索包含“hello”這個單詞的所有行。
select * from article where match(title) against("hello");
命中title和contain兩列的這個fulltext索引,並搜索包含“word”這個單詞的所有行。
select * from article where match(title, contain) against("word");
輸出match()這個mysql函數的返回值——搜索單詞的權重。
select title, match(title) against("word") as relevance from article ;
注意:其實完整的自然語言搜索需要添加IN NATURAL LANGUAGE MODE,如下所示
select * from article where match(title) against("hello" IN NATURAL LANGUAGE MODE);
5. 布爾模式索引
1. 特點
50%一樣的規則:不生效了
查詢結果不再按照相關程度排序
也可以對非fulltext索引列進行搜索,只是速度相比,有fulltext的速度要慢
2. 使用的方式
基本方式:要在mathc后面加 in boolean mode,(不加說明,默認使用自然排序 in natural language mode)
select * from apothegm where match(phrase) againts('hard' in boolean mode);
按單詞出現順序檢索,把對應單詞用雙引號引起來;
select * from apothegm where match(phrase) againts('“bell book and candle”' in boolean mode);
可以搜索必須出現,必須不出現,分別用+ 和 -標示:
select * from apothegm where match(phrase) againts('+bell -candle' in boolean mode);
可以用*作為通配符,標示以什么開頭(前綴)。但是還是必須遵守,單詞不能過短的約定。
6. 查詢擴展全文搜索(略)
三,中文分詞
1. 中文分詞的作用?
把一段中文,像一篇英文文章一樣,一個個的單詞(中文文章叫做詞語)使用空格隔開,然后用編碼工具把每個中文詞語編譯成英文字符亂碼,接着,每個英文亂碼之間也用空格間隔,這樣就成功的把一篇中文翻譯成看不懂的英文文章了,我們就可以使用fulltext索引,在這篇看不懂的英文文章中進行全文本搜素。
ps——注意:
1. 中文分詞的主要作用就,把一段中文,切分成一個個的中文詞語。
2. 然后進過unicode編碼,把每個單詞編碼為英文字符亂碼。
3.這個英文亂碼單詞是符合fulltext索引單詞定義的。
2. 中文分詞的介紹
中文分詞的原理是它有一本自己的字典。一般都有組件,執行某個方法就可以進行中文分詞啦。
大家可以參考github的結巴分詞
————————————————
原文鏈接:https://www.blog8090.com/mysqlzhong-wen-fen-ci-yuan-li/