1. 程式人生 > 資料庫 >【資料分析師_02_SQL+MySQL】022_MySQL的全文檢索(MyISAM,MATCH AGAINST)

【資料分析師_02_SQL+MySQL】022_MySQL的全文檢索(MyISAM,MATCH AGAINST)

MySQL的全文檢索

1 簡介

雖然之前學過的搜尋機制非常有用,但存在幾個重要的限制(萬用字元正則表示式WHERELIKE):

  • 效能——萬用字元和正則表示式匹配通常要求MySQL嘗試匹配表中所有行(而且這些搜尋極少使用表索引)。因此,由於被搜尋行數不斷增加,這些搜尋可能非常耗時。(大量大概可以定義為10G以上)
  • 明確控制——使用萬用字元和正則表示式匹配,很難(而且並不總是能)明確地控制匹配什麼不匹配什麼。例如,指定一個詞必須匹配,一個詞必須不匹配,而一個詞僅在第一個詞確實匹配的情況下才可以匹配或者才可以不匹配。

所有這些限制以及更多的限制都可以用全文字搜尋來解決。在使用全文字搜尋時,MySQL不需要分別檢視每個行,不需要分別分析和處理每個詞。

全文搜過通過MySQL建立指定列中各詞的一個索引,搜尋可以針對這些詞進行。這樣,MySQL可以快速有效地決定哪些詞匹配,哪些詞不匹配,它們匹配的頻率,等等。(WHERE和RE做不到)

儲存機制全文索引型別適用於
Innodb不支援事務性業務表(比如用於模糊查詢)
MyISAM支援資料型資料表
productnote支援資料型資料表

2 案例

2.1 啟用全文索引

注意:不要將業務類的主要表開啟MyISAM!

2.1.1 檢視並啟用表的儲存機制型別(Navicat):

在這裡插入圖片描述

2.1.2 檢視並啟用表的儲存機制型別(CMD):

CREATE TABLE productnotes
(
  note_id		int			NOT NULL		AUTO_INCREMENT,
  prod_id		char(10)	NOT NULL,
  note_date		datetime	NOT NULL,
  note_text		text		NULL ,
  PRIMARY KEY(note_id),
  FULLTEXT(note_text)
) ENGINE = MyISAM ;		# 在這裡設定

2.1.3 接下來的設定

首先:全文索引的資料型別必須是TEXT型別!不能是 char 或者 varchar 型別的!
在這裡插入圖片描述
必須是上圖 TEXT 類的資料,才可以開啟下圖的 FULLTEXT 的全文索引
在這裡插入圖片描述

2.2 進行全文索引

傳統模糊查詢方法:likeregex
全文索引模糊查詢方法:MATCH AGAINST

2.2.1 傳統模式(LIKE):

select note_text from productnotes
where note_text like '%rabbit%' ;

2.2.2 全文索引模式(MATCH AGAINST + WHERE):

select note_text from productnotes
where Match (note_text) AGAINST ('rabbit') ;

2.2.3 全文索引模式(匹配優先順序):

注:先出現關鍵字的,優先級別高
注:MATCH AGAINST 寫在 from 時, MATCH AGAINST 不作為篩選條件,而是顯示為優先順序(下圖第二列)
注:MATCH AGAINST 寫在 from 時, MATCH AGAINST 作為篩選條件

select note_text, MATCH(note_text) AGAINST ('rabbit') from productnotes

在這裡插入圖片描述

2.2.4 布林全文搜尋(重要)

布林操作符含義
+必須包含
-排除
>包含 增加等級
<包含 降低等級
()選擇其一
*詞尾匹配符
""定義短句

2.2.4.1 基本應用

在 productnotes 表中用 BOOLEAN 模式查詢所有包含 heavy 的 note_text 欄位:

select note_text from productnotes
where MATCH (note_text) 
AGAINST ('heavy' IN BOOLEAN MODE) ;

2.2.4.2 + 的應用

在 productnotes 表中用 BOOLEAN 模式查詢所有包含 rabbit 且包含 bait 的 note_text 欄位:

select note_text  from productnotes
where MATCH (note_text) 
AGAINST ('+rabbit +bait' IN BOOLEAN MODE) ;

2.2.4.3 - 的應用

在 productnotes 表中用 BOOLEAN 模式查詢所有包含 heavy 且不包含 rope 的 note_text 欄位:

select note_text from productnotes
where MATCH (note_text) 
AGAINST ('heavy -rope*' IN BOOLEAN MODE) ;

2.2.4.4 <> 的應用

在 productnotes 表中用 BOOLEAN 模式查詢所有包含 降低優先順序的 combination 的 note_text 欄位:

注:MATCH AGAINST 寫在 from 時, MATCH AGAINST 不作為篩選條件,而是顯示為優先順序
注:MATCH AGAINST 寫在 from 時, MATCH AGAINST 作為篩選條件

select note_text, MATCH(note_text) 
AGAINST ('+safe +(<combination)' IN BOOLEAN MODE)  from productnotes	# 這裡的 MATCH AGAINST 顯示為結果中的優先
where MATCH(note_text) 
AGAINST ('+safe +(<combination)' IN BOOLEAN MODE) ;		#這裡的 MATCH AGAINST 是篩選的作用

2.2.4.5 () 的應用

在 productnotes 表中用 BOOLEAN 模式查詢所有包含 safe 且包含 (combination 或 accepted) 的 note_text 欄位:

select note_text, MATCH(note_text) 
AGAINST ('+safe +(combination accepted)' IN BOOLEAN MODE)  from productnotes	# 這裡的 MATCH AGAINST 顯示為結果中的優先順序欄位
where MATCH(note_text) 
AGAINST ('+safe +(combination accepted)' IN BOOLEAN MODE) ;		#這裡的 MATCH AGAINST 是篩選的作用

全文搜尋結果不要優先順序的話,可以簡化成:

select note_text from productnotes
where MATCH(note_text) 
AGAINST ('+safe +(combination accepted)' IN BOOLEAN MODE) ;

2.2.4.6 其他的話

BOOLEAN 搜尋其實也運用在百度搜索上,好奇的小夥伴可以去查查用法,很實用,推薦。