數據庫學習----MySQL 全文索引
前言
我們在使用MySQL做模糊匹配的時候往往只能通過幾個相連的關鍵字進行匹配,這種方式MySQL是不會走索引進行搜索的。MySQL 5.6及以上版本給我們提供了一種可以通過更多方式進行匹配的搜索方式(全文索引查詢),並且是通過索引搜索數據。大大提高了查詢的效率。
索引的建立方式及銷燬方式
創建索引
- 無表的時候創建索引
CREATE TABLE table_name ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, author VARCHAR(200),
title VARCHAR(200), content TEXT(500), FULLTEXT full_index_name (col_name) ) ENGINE=InnoDB;
- 有表的時候創建索引
CREATE FULLTEXT INDEX full_index_name ON table_name(col_name);
刪除索引
- 直接刪除
DROP INDEX full_idx_name ON db_name.table_name;
- 使用alter table 的方式刪除
DROP INDEX full_idx_name ON db_name.table_name;
使用全文索引查詢數據
使用自然語言模式查詢
MySQL默認的分詞方法是所有非字母和數字的特殊符號都是分詞符(如果希望對中文進行分詞,則可以使用MySQL內置的ngram插件),對於太短的查詢則不會出現結果,默認是3個字符
-- 自然語言模式查詢(默認)
select
*
from
wenan_reptile_official wro
where
match ( content ,
tag ) AGAINST ('在哪裏 every man');
上面的SQL中match ( content ,tag ) AGAINST ('在哪裏 every man');
則是使用全文索引進行搜索
使用拓展模式查詢
拓展模式是經過兩次全文索引的結果,
第二次搜索使用第一次搜索的結果,讓結果更精確。
-- 拓展模式查詢
select
*
from
wenan_reptile_official wro
where
match ( content ,
tag ) AGAINST ('在哪裏 every man' WITH QUERY expansion);
boolean 模式
+:
表示該 word 必須存在
select
*
from
wenan_reptile_official wro
where
match ( content ,
tag ) AGAINST ('+在哪裏 -every man' IN BOOLEAN MODE);
-:
表示該 word 必須不存在- (no operator)表示該 word 是可選的,但是如果出現,其相關性會更高
select
*
from
wenan_reptile_official wro
where
match ( content ,
tag ) AGAINST ('在哪裏 every man' IN BOOLEAN MODE);
@distance
表示查詢的多個單詞之間的距離是否在 distance 之內,distance 的單位是字節,這種全文檢索的查詢也稱爲Proximity Search
,如MATCH(context) AGAINST('"Pease hot"@30' IN BOOLEAN MODE)
語句表示字符串 Pease 和 hot 之間的距離需在30字節內
select
*
from
wenan_reptile_official wro
where
match ( content ,
tag ) AGAINST ('在哪裏 "every man"@2' IN BOOLEAN MODE);
-- 表示every,man 兩個詞之間的距離在2字節以內
>
:表示出現該單詞時增加相關性(結果排序)<
:表示出現該單詞時降低相關性(結果排序)
select
*
from
wenan_reptile_official wro
where
match ( content ,
tag ) AGAINST ('在哪裏 >every <man' IN BOOLEAN MODE);
~
:表示允許出現該單詞,但出現時相關性爲負(結果排序)
select
*
from
wenan_reptile_official wro
where
match ( content ,
tag ) AGAINST ('在哪裏 ~every man' IN BOOLEAN MODE);
*
:表示以該單詞開頭的單詞,如lik*
,表示可以是lik
,like
,likes
select
*
from
wenan_reptile_official wro
where
match ( content ,
tag ) AGAINST ('在哪裏 every* man' IN BOOLEAN MODE);
- " :表示短語
select
*
from
wenan_reptile_official wro
where
match ( content ,
tag ) AGAINST ('"every man"' IN BOOLEAN MODE);