
- MySQL 基礎
- MySQL - 首頁
- MySQL - 簡介
- MySQL - 特性
- MySQL - 版本
- MySQL - 變數
- MySQL - 安裝
- MySQL - 管理
- MySQL - PHP 語法
- MySQL - Node.js 語法
- MySQL - Java 語法
- MySQL - Python 語法
- MySQL - 連線
- MySQL - Workbench
- MySQL 資料庫
- MySQL - 建立資料庫
- MySQL - 刪除資料庫
- MySQL - 選擇資料庫
- MySQL - 顯示資料庫
- MySQL - 複製資料庫
- MySQL - 資料庫匯出
- MySQL - 資料庫匯入
- MySQL - 資料庫資訊
- MySQL 使用者
- MySQL - 建立使用者
- MySQL - 刪除使用者
- MySQL - 顯示使用者
- MySQL - 修改密碼
- MySQL - 授予許可權
- MySQL - 顯示許可權
- MySQL - 收回許可權
- MySQL - 鎖定使用者賬戶
- MySQL - 解鎖使用者賬戶
- MySQL 表
- MySQL - 建立表
- MySQL - 顯示錶
- MySQL - 修改表
- MySQL - 重命名錶
- MySQL - 克隆表
- MySQL - 截斷表
- MySQL - 臨時表
- MySQL - 修復表
- MySQL - 描述表
- MySQL - 新增/刪除列
- MySQL - 顯示列
- MySQL - 重新命名列
- MySQL - 表鎖定
- MySQL - 刪除表
- MySQL - 派生表
- MySQL 查詢
- MySQL - 查詢
- MySQL - 約束
- MySQL - 插入查詢
- MySQL - 選擇查詢
- MySQL - 更新查詢
- MySQL - 刪除查詢
- MySQL - 替換查詢
- MySQL - 插入忽略
- MySQL - 插入重複鍵更新
- MySQL - 插入到選擇
- MySQL 運算子和子句
- MySQL - Where 子句
- MySQL - Limit 子句
- MySQL - Distinct 子句
- MySQL - Order By 子句
- MySQL - Group By 子句
- MySQL - Having 子句
- MySQL - AND 運算子
- MySQL - OR 運算子
- MySQL - Like 運算子
- MySQL - IN 運算子
- MySQL - ANY 運算子
- MySQL - EXISTS 運算子
- MySQL - NOT 運算子
- MySQL - 不等於運算子
- MySQL - IS NULL 運算子
- MySQL - IS NOT NULL 運算子
- MySQL - Between 運算子
- MySQL - UNION 運算子
- MySQL - UNION 與 UNION ALL
- MySQL - MINUS 運算子
- MySQL - INTERSECT 運算子
- MySQL - INTERVAL 運算子
- MySQL 連線
- MySQL - 使用連線
- MySQL - 內連線
- MySQL - 左連線
- MySQL - 右連線
- MySQL - 交叉連線
- MySQL - 全連線
- MySQL - 自連線
- MySQL - 刪除連線
- MySQL - 更新連線
- MySQL - Union 與 Join
- MySQL 觸發器
- MySQL - 觸發器
- MySQL - 建立觸發器
- MySQL - 顯示觸發器
- MySQL - 刪除觸發器
- MySQL - 插入前觸發器
- MySQL - 插入後觸發器
- MySQL - 更新前觸發器
- MySQL - 更新後觸發器
- MySQL - 刪除前觸發器
- MySQL - 刪除後觸發器
- MySQL 資料型別
- MySQL - 資料型別
- MySQL - VARCHAR
- MySQL - BOOLEAN
- MySQL - ENUM
- MySQL - DECIMAL
- MySQL - INT
- MySQL - FLOAT
- MySQL - BIT
- MySQL - TINYINT
- MySQL - BLOB
- MySQL - SET
- MySQL 正則表示式
- MySQL - 正則表示式
- MySQL - RLIKE 運算子
- MySQL - NOT LIKE 運算子
- MySQL - NOT REGEXP 運算子
- MySQL - regexp_instr() 函式
- MySQL - regexp_like() 函式
- MySQL - regexp_replace() 函式
- MySQL - regexp_substr() 函式
- MySQL 函式 & 運算子
- MySQL - 日期和時間函式
- MySQL - 算術運算子
- MySQL - 數字函式
- MySQL - 字串函式
- MySQL - 聚合函式
- MySQL 雜項概念
- MySQL - NULL 值
- MySQL - 事務
- MySQL - 使用序列
- MySQL - 處理重複項
- MySQL - SQL 注入
- MySQL - 子查詢
- MySQL - 註釋
- MySQL - 檢查約束
- MySQL - 儲存引擎
- MySQL - 將表匯出到 CSV 檔案
- MySQL - 將 CSV 檔案匯入資料庫
- MySQL - UUID
- MySQL - 公共表表達式
- MySQL - On Delete Cascade
- MySQL - Upsert
- MySQL - 水平分割槽
- MySQL - 垂直分割槽
- MySQL - 遊標
- MySQL - 儲存函式
- MySQL - Signal
- MySQL - Resignal
- MySQL - 字元集
- MySQL - 校對
- MySQL - 萬用字元
- MySQL - 別名
- MySQL - ROLLUP
- MySQL - 今日日期
- MySQL - 字面量
- MySQL - 儲存過程
- MySQL - Explain
- MySQL - JSON
- MySQL - 標準差
- MySQL - 查詢重複記錄
- MySQL - 刪除重複記錄
- MySQL - 選擇隨機記錄
- MySQL - Show Processlist
- MySQL - 更改列型別
- MySQL - 重置自動遞增
- MySQL - Coalesce() 函式
- MySQL 有用資源
- MySQL - 有用函式
- MySQL - 語句參考
- MySQL - 快速指南
- MySQL - 有用資源
- MySQL - 討論
MySQL - 布林全文搜尋
MySQL 布林全文搜尋
MySQL 提供了全文搜尋功能,支援三種類型的搜尋,其中一種是布林全文搜尋。
這種布林全文搜尋透過允許使用布林運算子(例如 +、-、>、<、* 等)和搜尋字串,能夠對大量文字資料執行復雜的搜尋操作。
與搜尋概念的自然語言全文搜尋不同,MySQL 中的布林全文搜尋查詢特定單詞。要執行此類搜尋,需要在 AGAINST 表示式中包含IN BOOLEAN MODE 修飾符。
語法
以下是使用 IN BOOLEAN MODE 修飾符和 MySQL 中的 AGAINST 表示式執行布林全文搜尋的語法:
SELECT column_name(s) FROM table_name WHERE MATCH(target_column_names) AGAINST(expression IN BOOLEAN MODE);
其中,
- target_column_names 是我們要在其中搜索關鍵字的列的名稱。
- expression 是帶有布林運算子的關鍵字列表。
MySQL 布林全文搜尋運算子
下表指定了全文搜尋布林運算子:
運算子 | 描述 |
---|---|
+ | 包含,該單詞必須存在。 |
- | 排除,該單詞必須不存在。 |
> | 包含,該單詞必須存在,並且具有更高的優先順序。 |
< | 包含,該單詞必須存在,並且具有較低的優先順序。 |
() | 將單詞分組到子表示式中 |
示例
首先,讓我們使用以下查詢建立一個名為ARTICLES 的表:
CREATE TABLE ARTICLES ( ID INT AUTO_INCREMENT NOT NULL PRIMARY KEY, ARTICLE_TITLE VARCHAR(100), DESCRIPTION TEXT, FULLTEXT (ARTICLE_TITLE, DESCRIPTION) );
在上面的查詢中,我們在ARTICLE_TITLE 和DESCRIPTION 列上定義了全文索引。現在,讓我們將值插入到上面建立的表中:
INSERT INTO ARTICLES (ARTICLE_TITLE, DESCRIPTION) VALUES ('MySQL Tutorial', 'MySQL is a relational database system that uses SQL to structure data stored'), ('Java Tutorial', 'Java is an object-oriented and platform-independent programming languag'), ('Hadoop Tutorial', 'Hadoop is framework that is used to process large sets of data'), ('Big Data Tutorial', 'Big Data refers to data that has wider variety of data sets in larger numbers'), ('JDBC Tutorial', 'JDBC is a Java based technology used for database connectivity');
ARTICLES 表建立如下:
ID | ARTICLE_TITLE | DESCRIPTION |
---|---|---|
1 | MySQL 教程 | MySQL 是一個關係資料庫系統,它使用 SQL 來構造儲存的資料 |
2 | Java 教程 | Java 是一種面向物件且與平臺無關的程式語言 |
3 | Hadoop 教程 | Hadoop 是一個用於處理大型資料集的框架 |
4 | 大資料教程 | 大資料是指具有更大數量和更廣泛資料型別的更大資料集 |
5 | JDBC 教程 | JDBC 是一種基於 Java 的技術,用於資料庫連線 |
現在,讓我們在布林模式下執行全文搜尋,我們正在搜尋包含單詞“data”的行:
SELECT * FROM ARTICLES WHERE MATCH (ARTICLE_TITLE, DESCRIPTION) AGAINST('data' IN BOOLEAN MODE);
輸出
如下面的輸出所示,上面的查詢返回了三行包含單詞“data”的行:
ID | ARTICLE_TITLE | DESCRIPTION |
---|---|---|
4 | 大資料教程 | 大資料是指具有更大數量和更廣泛資料型別的更大資料集 |
1 | MySQL 教程 | MySQL 是一個關係資料庫系統,它使用 SQL 來構造儲存的資料 |
3 | Hadoop 教程 | Hadoop 是一個用於處理大型資料集的框架 |
示例
在下面的查詢中,我們正在搜尋包含單詞“data”但不包含“sets”的行:
SELECT * FROM ARTICLES WHERE MATCH(ARTICLE_TITLE, DESCRIPTION) AGAINST('+data -sets' IN BOOLEAN MODE);
輸出
上面查詢的輸出如下所示:
ARTICLE_TITLE | DESCRIPTION |
---|---|
MySQL 教程 | MySQL 是一個關係資料庫系統,它使用 SQL 來構造儲存的資料 |
示例
這裡,我們正在搜尋包含“data”和“set”這兩個單詞的行:
SELECT * FROM ARTICLES WHERE MATCH(ARTICLE_TITLE, DESCRIPTION) AGAINST('+data +sets' IN BOOLEAN MODE);
輸出
執行給定查詢後,輸出顯示如下:
ID | ARTICLE_TITLE | DESCRIPTION |
---|---|---|
4 | 大資料教程 | 大資料是指具有更大數量和更廣泛資料型別的更大資料集 |
3 | Hadoop 教程 | Hadoop 是一個用於處理大型資料集的框架 |
示例
在下面的查詢中,我們正在搜尋包含單詞“set”的行,但對於包含“set”的行,其排名較低:
SELECT * FROM ARTICLES WHERE MATCH(ARTICLE_TITLE, DESCRIPTION) AGAINST('+data sets' IN BOOLEAN MODE);
輸出
當我們執行上面的查詢時,獲得的輸出如下所示:
ID | ARTICLE_TITLE | DESCRIPTION |
---|---|---|
4 | 大資料教程 | 大資料是指具有更大數量和更廣泛資料型別的更大資料集 |
3 | Hadoop 教程 | Hadoop 是一個用於處理大型資料集的框架 |
1 | MySQL 教程 | MySQL 是一個關係資料庫系統,它使用 SQL 來構造儲存的資料 |
示例
使用以下查詢,我們正在搜尋包含單詞“data”的行,如果它包含單詞“tutorial”,則將該特定記錄在搜尋中的排名降低:
SELECT * FROM ARTICLES WHERE MATCH(ARTICLE_TITLE, DESCRIPTION) AGAINST('+data ~sets' IN BOOLEAN MODE);
輸出
執行給定查詢後,輸出顯示如下:
ID | ARTICLE_TITLE | DESCRIPTION |
---|---|---|
4 | 大資料教程 | 大資料是指具有更大數量和更廣泛資料型別的更大資料集 |
1 | MySQL 教程 | MySQL 是一個關係資料庫系統,它使用 SQL 來構造儲存的資料 |
3 | Hadoop 教程 | Hadoop 是一個用於處理大型資料集的框架 |
示例
這裡,我們找到所有包含以“set”開頭的單詞的行:
SELECT * FROM ARTICLES WHERE MATCH(ARTICLE_TITLE, DESCRIPTION) AGAINST('set*' IN BOOLEAN MODE);
輸出
執行給定查詢後,輸出顯示如下:
ID | ARTICLE_TITLE | DESCRIPTION |
---|---|---|
3 | Hadoop 教程 | Hadoop 是一個用於處理大型資料集的框架 |
4 | 大資料教程 | 大資料是指具有更大數量和更廣泛資料型別的更大資料集 |
MySQL 布林全文搜尋特性
以下是 MySQL 布林全文搜尋的一些重要特性:
- 在布林全文搜尋中,MySQL 不會自動按相關性降序對行進行排序。
- InnoDB 表要求 MATCH 表示式的所有列都具有 FULLTEXT 索引才能執行布林查詢。
- 如果我們在 InnoDB 表上對搜尋查詢提供多個布林運算子,例如 '++hello',MySQL 不支援它們,並且會生成錯誤。但是,如果我們在 MyISAM 中執行相同的操作,它會忽略額外的運算子並使用最靠近搜尋詞的運算子。
- InnoDB 全文搜尋不支援尾隨的 (+) 或 (-) 符號。它只支援前導的 + 或 - 符號。
- 如果搜尋詞是 'hello+' 或 'hello-',MySQL 將會生成錯誤。此外,以下內容也會生成錯誤:'+*'、'+-'。
- 如果某個詞出現在超過 50% 的行中,MySQL 會忽略搜尋結果中的該詞。這稱為 50% 閾值。
使用客戶端程式進行布林全文搜尋
我們還可以使用客戶端程式在 MySQL 資料庫上執行布林全文搜尋操作。
語法
要透過 PHP 程式執行布林全文搜尋,我們需要使用 **mysqli** 函式 **query()** 執行以下 SELECT 語句,如下所示:
$sql = "SELECT * FROM articles WHERE MATCH(ARTICLE_TITLE, DESCRIPTION) AGAINST('+data -sets' IN BOOLEAN MODE)"; $mysqli->query($sql);
要透過 JavaScript 程式執行布林全文搜尋,我們需要使用 **mysql2** 庫的 **query()** 函式執行以下 SELECT 語句,如下所示:
sql = `SELECT * FROM articles WHERE MATCH(ARTICLE_TITLE, DESCRIPTION) AGAINST('+data -sets' IN BOOLEAN MODE)`; con.query(sql);
要透過 Java 程式執行布林全文搜尋,我們需要使用 **JDBC** 函式 **executeQuery()** 執行 SELECT 語句,如下所示:
String sql = "SELECT * FROM articles WHERE MATCH(ARTICLE_TITLE, DESCRIPTION) AGAINST('+data -sets' IN BOOLEAN MODE)"; statement.executeQuery(sql);
要透過 Python 程式執行布林全文搜尋,我們需要使用 **MySQL Connector/Python** 的 **execute()** 函式執行 SELECT 語句,如下所示:
boolean_fulltext_search_query = 'select * from articles where MATCH (ARTICLE_TITLE, DESCRIPTION) AGAINST('data' IN BOOLEAN MODE)' cursorObj.execute(boolean_fulltext_search_query)
示例
以下是程式示例:
$dbhost = 'localhost'; $dbuser = 'root'; $dbpass = 'password'; $dbname = 'TUTORIALS'; $mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname); if ($mysqli->connect_errno) { printf("Connect failed: %s
", $mysqli->connect_error); exit(); } // printf('Connected successfully.
'); //creating a table Articles that stores fulltext. $sql = "CREATE TABLE Articles (ID INT AUTO_INCREMENT NOT NULL PRIMARY KEY, ARTICLE_TITLE VARCHAR(100), DESCRIPTION TEXT, FULLTEXT (ARTICLE_TITLE, DESCRIPTION))"; $result = $mysqli->query($sql); if ($result) { printf("Table created successfully...!\n"); } //insert data $q = "INSERT INTO Articles (ARTICLE_TITLE, DESCRIPTION) VALUES ('MySQL Tutorial', 'MySQL is a relational database system that uses SQL to structure data stored'), ('Java Tutorial', 'Java is an object-oriented and platform-independent programming languag'), ('Hadoop Tutorial', 'Hadoop is framework that is used to process large sets of data'), ('Big Data Tutorial', 'Big Data refers to data that has wider variety of data sets in larger numbers'), ('JDBC Tutorial', 'JDBC is a Java based technology used for database connectivity')"; if ($res = $mysqli->query($q)) { printf("Data inserted successfully...!\n"); } $s = "SELECT * FROM articles WHERE MATCH(ARTICLE_TITLE, DESCRIPTION) AGAINST('+data -sets' IN BOOLEAN MODE)"; if ($r = $mysqli->query($s)) { printf("Table Records: \n"); while ($row = $r->fetch_assoc()) { printf(" ID: %d, Title: %s, Descriptions: %s", $row["id"], $row["ARTICLE_TITLE"], $row["DESCRIPTION"]); printf("\n"); } } else { printf('Failed'); } $mysqli->close();
輸出
獲得的輸出如下所示:
Table created successfully...! Data inserted successfully...! Table Records: ID: 1, Title: MySQL Tutorial, Descriptions: MySQL is a relational database system that uses SQL to structure data stored
var mysql = require("mysql2"); var con = mysql.createConnection({ host: "localhost", user: "root", password: "password", }); //Connecting to MySQL con.connect(function (err) { if (err) throw err; // console.log("Connected successfully...!"); // console.log("--------------------------"); sql = "USE TUTORIALS"; con.query(sql); sql = "CREATE TABLE Articles (ID INT AUTO_INCREMENT NOT NULL PRIMARY KEY, ARTICLE_TITLE VARCHAR(100), DESCRIPTION TEXT, FULLTEXT (ARTICLE_TITLE, DESCRIPTION) )"; con.query(sql); //insert data into created table sql = `INSERT INTO Articles (ARTICLE_TITLE, DESCRIPTION) VALUES ('MySQL Tutorial', 'MySQL is a relational database system that uses SQL to structure data stored'), ('Java Tutorial', 'Java is an object-oriented and platform-independent programming languag'), ('Hadoop Tutorial', 'Hadoop is framework that is used to process large sets of data'), ('Big Data Tutorial', 'Big Data refers to data that has wider variety of data sets in larger numbers'), ('JDBC Tutorial', 'JDBC is a Java based technology used for database connectivity')`; con.query(sql); //display the table details!... sql = `SELECT * FROM articles WHERE MATCH(ARTICLE_TITLE, DESCRIPTION) AGAINST('+data -sets' IN BOOLEAN MODE)`; con.query(sql, function (err, result) { if (err) throw err; console.log(result); }); });
輸出
獲得的輸出如下所示:
[ { id: 1, ARTICLE_TITLE: 'MySQL Tutorial', DESCRIPTION: 'MySQL is a relational database system that uses SQL to structure data stored' } ]
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class BooleanFulltextSearch { public static void main(String[] args) { String url = "jdbc:mysql://:3306/TUTORIALS"; String username = "root"; String password = "password"; try { Class.forName("com.mysql.cj.jdbc.Driver"); Connection connection = DriverManager.getConnection(url, username, password); Statement statement = connection.createStatement(); System.out.println("Connected successfully...!"); //creating a table that takes fulltext column...! String sql = "CREATE TABLE Articles (ID INT AUTO_INCREMENT NOT NULL PRIMARY KEY, ARTICLE_TITLE VARCHAR(100), DESCRIPTION TEXT, FULLTEXT (ARTICLE_TITLE, DESCRIPTION) )"; statement.execute(sql); System.out.println("Table created successfully...!"); //inserting data to the table String insert = "INSERT INTO Articles (ARTICLE_TITLE, DESCRIPTION) VALUES" + "('MySQL Tutorial', 'MySQL is a relational database system that uses SQL to structure data stored')," + "('Java Tutorial', 'Java is an object-oriented and platform-independent programming languag')," + "('Hadoop Tutorial', 'Hadoop is framework that is used to process large sets of data')," + "('Big Data Tutorial', 'Big Data refers to data that has wider variety of data sets in larger numbers')," + "('JDBC Tutorial', 'JDBC is a Java based technology used for database connectivity')"; statement.execute(insert); System.out.println("Data inserted successfully...!"); //displaying the fulltext records in the boolean mode: ResultSet resultSet = statement.executeQuery("SELECT * FROM articles WHERE MATCH(ARTICLE_TITLE, DESCRIPTION) AGAINST('+data -sets' IN BOOLEAN MODE)"); while (resultSet.next()){ System.out.println(resultSet.getString(1)+" "+resultSet.getString(2)+ " "+resultSet.getString(3)); } connection.close(); } catch (Exception e) { System.out.println(e); } } }
輸出
獲得的輸出如下所示:
Connected successfully...! Table created successfully...! Data inserted successfully...! 1 MySQL Tutorial MySQL is a relational database system that uses SQL to structure data stored
import mysql.connector # Establishing the connection connection = mysql.connector.connect( host='localhost', user='root', password='password', database='tut' ) # Creating a cursor object cursorObj = connection.cursor() boolean_fulltext_search_query = f"select * from articles where MATCH (ARTICLE_TITLE, DESCRIPTION) AGAINST('data' IN BOOLEAN MODE)" cursorObj.execute(boolean_fulltext_search_query) # Fetching all the results results = cursorObj.fetchall() # Display the result print("Boolean Fulltext search results:") for row in results: print(row) cursorObj.close() connection.close()
輸出
獲得的輸出如下所示:
Boolean Fulltext search results: (4, 'Big Data Tutorial', 'Big Data refers to data that has wider variety of data sets in larger numbers') (1, 'MySQL Tutorial', 'MySQL is a relational database system that uses SQL to structure data stored') (3, 'Hadoop Tutorial', 'Hadoop is framework that is used to process large sets of data')