Navicat 部落格

在 MySQL 中執行全文檢索搜尋(第 3 部分)| Navicat Blog 2019 年 12 月 19 日,由 Robert Gravelle 撰寫

歡迎來到本系列的第 3 部分,本篇收錄了關於 MySQL 中的全文索引和搜尋。在第 1 部分中,我們了解了 MySQL 如何透過 FULLTEXT 索引以及以下三種不同的類型提供全文檢索搜尋功能:

  • 自然語言全文檢索搜尋
  • 布爾全文檢索搜尋
  • 擴展查詢搜尋

第 2 部分中,我描述了如何在 Navicat for MySQL中執行自然語言全文檢索搜尋。今天的文章緊隨其後,涵蓋了另一種全文檢索搜尋:布爾全文檢索搜尋。

布爾模式描述

布爾模式比自然語言全文檢索搜尋更受字詞導向。這樣,布爾全文檢索搜尋支援非常複雜的查詢,其中包括布爾運算子。對於經驗豐富的使用者,布爾全文檢索搜尋提供了一種執行非常進階的搜尋的方法。

運作方式如下:

若要在布爾模式下執行全文檢索搜尋,請在 AGAINST 運算式中包含 IN BOOLEAN MODE 修飾詞。回想一下,在上一篇文章中,我們在 Sakila 範例資料庫 的 film 資料表中加入了全文索引,以便可以在 description 欄位中執行全文檢索搜尋。以下例子傳回所有 description 欄位包含「Butler」一詞的電影:

MySQL - Boolean Mode - 1

一些更複雜的例子

上述的搜尋是非常簡單,不需要全文檢索搜尋。一旦要執行排除包含某些關鍵字的符合項目之類的操作,它將變得更加有趣。 例如,透過在字詞「Documentary」之前加上排除布爾運算子(-),我們可以找到描述中包含「Butler」一詞的非紀錄片電影:

MySQL - Boolean Mode Exclude

這查詢將傳回 61 列,而之前的查詢為 73 列。

多字詞比對

我們還可以使用(+)包含運算字搜尋 description 與多個字詞符合的列。給字詞加上前置詞會告訴搜尋引擎只對應包含該字詞的列。當存在多個字詞(例如 +Butler Hunter Waitress)時,這將成為重要的區別。在這種情況下,將傳回其 description 包含字詞「Butler」以及其他兩個字詞之一的所有列:

MySQL - Boolean Mode Multi

將上面的結果與由「Butler」和「Hunter」兩個詞加上(+)包括運算字的查詢所產生的結果進行比較:

MySQL - Boolean Mode Multi - 2

現在,符合的列必須同時包含「Butler」和「Hunter」,但不一定包含「Waitress」。

相關性次序的簡介

全文檢索搜尋對 InnoDB 的次序結果與對 MyISAM 的次序結果不同,因為 InnoDB 全文檢索搜尋是以 Sphinx 全文檢索搜尋引擎建模,並且所使用的演算是以 BM25 和 TF-IDF 次序演算法為基礎。

一些運算子會影響次序,因此我們可以進一步調整結果。例如,我們可以搜尋包含字詞「Butler」的列,而如果包含字詞「Hunter」或「Waitress」的列則排在下面:

MySQL - Boolean mode rank lower

總結

在今天的文章中,我們學習了如何使用 Navicat for MySQL 執行布爾全文檢索搜尋。有興趣進一步了解 Navicat for MySQL 嗎?你可以免費試用 14 天!

若要有關布爾全文檢索運算子的完整清單,請查看官方的 MySQL 文件

Navicat 文章
頻道記錄
分享
部落格封存檔