MySQL必知必會—文本搜索篇

MySQL必知必會—概念篇node

MySQL必知必會—安裝應用篇mysql

MySQL必知必會—檢索數據篇git

MySQL必知必會—聯結表和高級查詢篇github

下面用到的數據庫文件可在 mysql_scripts 找到。


全文本搜索

並不是全部引擎都支持全文本搜索,例如 MyISAM 支持全文本搜索,InnoDB 不支持。sql

在建立表時啓用全文本搜索, CREATE TABLE 語句接受 FULLTEXT 子句,它能夠對後面的一個或多個表創建索引,MySQL自動維護該索引,在增長、更新或刪除行時,索引隨之自動更新。FULLTEXT 也能夠在表建立以後再指定。數據庫

### 看一下 productnotes 表的建立描述
CREATE TABLE `productnotes` (
  `note_id` int(11) NOT NULL AUTO_INCREMENT,
  `prod_id` char(10) NOT NULL,
  `note_date` datetime NOT NULL,
  `note_text` text,
  PRIMARY KEY (`note_id`),
  FULLTEXT KEY `note_text` (`note_text`)
) ENGINE=MyISAM AUTO_INCREMENT=115 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

複製代碼

建立索引後就能夠用 Match() 和 Against() 執行全文本搜索,其中 Match() 指定被搜索的列, Against() 指定要使用的搜索表達式。post

### 搜索出 node_text 中包含 rabbit 的。

### 先用 LIKE 實現
SELECT note_text FROM productnotes WHERE note_text LIKE '%rabbit%';
+-----------------------------------------------+
| Quantity varies, …… for use as rabbit bait. |
| Customer complaint: rabbit has …… |
+-----------------------------------------------+

### 使用文本搜索實現,能夠看到 rabbit 排在第三個詞的文本比排在第20個詞的文本排序高。
SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit');
+-----------------------------------------------+
| Customer complaint: rabbit has …… |
| Quantity varies, …… for use as rabbit bait. |
+-----------------------------------------------+

### 可使用下面的語句查看排序的等級
SELECT note_text, Match(note_text) Against('rabbit') AS rank1 FROM productnotes;
### 除了查出來的兩個有數據,其餘的等級都是0
| Customer complaint: rabbit has …… | 的等級是 1.6408053636550903
| Quantity varies, …… for use as rabbit bait. | 的等級是 1.5905543565750122


### 使用查詢擴展 WITH QUERY EXPANSION ,找出全部提到 anvils 的註釋,還要找出與當前搜索有關的全部其餘行,即便它們不包含 anvils
SELECT note_text FROM productnotes WHERE Match(note_text) Against('anvils' WITH QUERY EXPANSION);
### 會返回7行,可是隻有第一行有 anvils ,第二行雖然與 anvils 無關,但由於它包含了第一行的兩個詞,因此也被檢索出來。

複製代碼

注意

  • 傳遞給 Match() 的值必須與 FULLTEXT() 定義中的相同。若是指定多個列,必須列出他們,並且次序正確。
  • 通過比較能夠發現,文本搜索是默認帶有排序的,LIKE 搜索出來的結果是隨意的,按照查詢的前後輸出。
  • 文本搜索的等級根據行中詞的數目,惟一詞的數目,整個索引中詞的總數,以及包含該詞的行的書目計算出來。
  • 在索引全文本數據時,短詞被忽略且從索引中排除。短詞的定義時那些具備3個或3個一下字符的詞(若是須要,這個數目能夠改)
  • 許多詞出現的頻率很高,搜索他們沒用,MySQL 規定了一條 50% 規則,若是一個詞出現50%以上的行中,則將它做爲一個非用詞忽略。50%規則不用於 IN BOOLEAN MODE。
  • 若是表中的行數少於3行,則全文本搜索不返回結果
  • 忽略詞中的單引號。例如,don't 索引爲 dont
  • 不具備詞分隔符(包括日語和漢語)的語言不能恰當地返回全文本搜索結果

布爾文本查詢

IN BOOLEAN MODE,即便沒有 FULLTEXT 索引,也可使用spa

### 匹配包含 heavy 但不包含任意以 rope 開始的詞的行
SELECT note_text FROM productnotes WHERE Match(note_text) Against('heavy -rope*' IN BOOLEAN MODE);

### 匹配詞 safe 和 combination, 下降後者的等級。
SELECT note_text FROM productnotes WHERE Match(note_text) Against('+safe +(<combination)' IN BOOLEAN MODE);
複製代碼

全文本布爾操做符code

布爾操做符 說 明
+ 包含,詞必須存在
- 排除,詞必須不出現
> 包含,並且增長等級值
< 包含,且減小等級值
() 把詞組成子表達式(容許這些子表達式做爲一個組被包含、排除、 排列等)
~ 取消一個詞的排序值
* 詞尾的通配符
"" 定義一個短語(與單個詞的列表不同,它匹配整個短語以便包含或排除這個短語)

一個持續更新的github筆記,連接地址:Front-End-Basics,能夠watch,也能夠star。排序

此篇文章的地址:MySql必知必會

相關文章
相關標籤/搜索