介紹
大部分技術員在處理搜尋問題的時候,往往直接依賴資料庫的查詢功能,通過普通 SQL 語句的數值比較, 範圍的過濾等就可以完成絕大多數我們需要的查詢了, 但是如果你希望通過關鍵字的匹配來進行查詢過濾, 那麼就需要基於相似度的查詢, 而不是原來的精確數值比較, 那麼這種查詢我們第一個想到的肯定是 LIKE 的 SQL 語句, 但是LIKE模糊查詢它的工作原理是全表掃描, 如果資料量非常大, 那麼會造成非常嚴重的卡頓, 也可能出現整個專案崩掉, 而全文索引的設計就是避免這種情況的發生
全文搜尋分類
自然語言搜尋
(預設型別):MySQL 會把搜尋的字串解析成一系列的單詞,然後去搜尋包含的行;布林模式搜尋
:可以為搜尋的字串里加修飾詞,或者必須是什麼短語,安順序搜尋等查詢擴充套件搜尋
:這種搜尋分為兩個階段。第一階段,是自然語言搜素。第二階段,則先把原來的搜尋字串,與第一階段的搜尋裡高度匹配的那些行,連線到一起。
全文搜尋的特性
- 全文搜尋基於 FullText 索引。在 FullText 索引, 裡只能出現在
CHAR
VARCHAR
TEXT
這幾種型別裡 - 全文搜尋會
忽略那些常見詞
:常見詞,指的是至少一半的行裡都出現過,超過 50% 的詞,都為常見詞; - 有些為內建的常用單詞:也叫停用詞,比如:
the after other
- 比較短的單詞也會被停用
所謂的中文全文索引,就是用一本字典,把一段中文字,拆分為一個個的詞語,這樣來符合 FullText 的單詞定義。然後完全可以把中文看作成英文,進行全文字索引!
建表語句
- 建立表,不一定要主鍵索引
create table apothegm( attribution varchar(40), phrase text ) engine = myisan;
- 增加全文索引
alert table apothegm add fulltext (phrase), add fulltext (attribution), add fulltext (phrase,attribution); 個人理解: 1. 索引分為,單列索引和複合索引。 2. 每次在進行搜尋的時候,必須要有一個 FullText 索引,而它正好是由查詢命令裡列出的那些欄位組成。 3. 索引越多,寫入資料越慢,但是索引的方式也就越多,越加便捷。
自然語言索引
- 基本 SQL 語句
//應用其第一個 FullText 索引
select * from apothegm where match(phrase) againts('time');
//應用其第三個 FullText 索引
select * from apothegm where match(phrase,attribution) againts('time');
- 輸出相關程度 : 自然語言型別的全文搜尋。其輸出是按照相關程度遞減順序排列,相關度是一個非負數的浮點數,其中
0代表毫不相關
select phrase,match(phrase) against('time') as relavance from apothegm
PS:把匹配的結構,當作一個獨立欄位,其中 relavance 為相關程度的意思
- 多個詞一起查詢,比如查詢
hard
或者soft
select * from apothegm where match(phrase) againts('hard soft');
布林模式的全文索引
特點
- 50% 一樣的規則:不生效了
- 查詢結果不再按照
相關程度排序
- 也可以對非 FullText 索引列進行搜尋,只是速度相比,有 FullText 的速度要慢
使用的方式
-
基本方式:要在
MATCH
後面加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);
- 可以用*作為萬用字元, 標示以什麼開頭的。但是還是必須遵守,單詞不能過短的約定。
配置全文搜尋引擎
全文索引的引數是可以配置的,可以通過系統變數的辦法進行修改。
- 變數
ft_min_word_len
和ft_max_word_len
來設定單詞所具有的最小長度,和最大長度。預設最小值與最大值分別為 4 和 84 -
在
my.conf
的mysqld
下新增 下面語句,然後重啟。ft_min_word_len = 1
-
如果是已經建立 FullText 索引表,必須重新建立這些索引關係,但也是可以快速修復。
repair table tbl_name quick;
- 如果是在此之後新建的 FullText 索引,都可以更新使用這個值。