
- 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 - INSERT 查詢
- MySQL - SELECT 查詢
- MySQL - UPDATE 查詢
- MySQL - DELETE 查詢
- MySQL - REPLACE 查詢
- MySQL - INSERT IGNORE
- MySQL - INSERT ON DUPLICATE KEY UPDATE
- MySQL - INSERT INTO SELECT
- 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 vs UNION ALL
- MySQL - MINUS 運算子
- MySQL - INTERSECT 運算子
- MySQL - INTERVAL 運算子
- MySQL 連線
- MySQL - 使用連線
- MySQL - INNER JOIN
- MySQL - LEFT JOIN
- MySQL - RIGHT JOIN
- MySQL - CROSS JOIN
- MySQL - FULL JOIN
- MySQL - 自連線
- MySQL - DELETE JOIN
- MySQL - UPDATE JOIN
- MySQL - UNION vs JOIN
- MySQL 觸發器
- MySQL - 觸發器
- MySQL - 建立觸發器
- MySQL - 顯示觸發器
- MySQL - 刪除觸發器
- MySQL - BEFORE INSERT 觸發器
- MySQL - AFTER INSERT 觸發器
- MySQL - BEFORE UPDATE 觸發器
- MySQL - AFTER UPDATE 觸發器
- MySQL - BEFORE DELETE 觸發器
- MySQL - AFTER DELETE 觸發器
- 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 - 公共表表達式 (CTE)
- 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 這樣的關係資料庫中,全文搜尋是一種用於檢索可能與搜尋關鍵詞不完全匹配的結果集的技術。全文搜尋使用三種搜尋模式:
自然語言模式
查詢擴充套件模式
布林模式
自然語言全文搜尋
自然語言全文搜尋在 **IN NATURAL LANGUAGE** 模式下執行常規全文搜尋。當在此模式下執行全文搜尋時,搜尋結果將按照它們與關鍵詞的相關性順序顯示(根據該關鍵詞執行搜尋)。這是全文搜尋的預設模式。
由於這是全文搜尋,因此必須在基於文字的列(例如 CHAR、VARCHAR、TEXT 資料型別列)上應用 FULLTEXT 索引。FULLTEXT 索引是一種特殊的索引型別,用於搜尋文字值中的關鍵詞,而不是嘗試將關鍵詞與這些列值進行比較。
語法
以下是執行自然語言全文搜尋的基本語法:
SELECT * FROM table_name WHERE MATCH(column_name(s)) AGAINST ('keyword_name' IN NATURAL LANGUAGE MODE);
示例
讓我們透過以下示例瞭解如何在資料庫表上執行自然語言全文搜尋。
為此,我們將首先建立一個名為 **ARTICLES** 的表,其中包含文章的標題和描述。FULLTEXT 索引應用於文字列 **article_title** 和 **descriptions**,如下所示:
CREATE TABLE ARTICLES ( ID INT AUTO_INCREMENT NOT NULL PRIMARY KEY, ARTICLE_TITLE VARCHAR(100), DESCRIPTION TEXT, FULLTEXT (ARTICLE_TITLE, DESCRIPTION) ) ENGINE = InnoDB;
現在,讓我們使用以下查詢將有關文章的詳細資訊(例如它們的標題和描述)插入此表:
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 language'), ('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');
建立的表如下:
ID | ARTICLE_TITLE | DESCRIPTION |
---|---|---|
1 | MySQL 教程 | MySQL 是一種關係資料庫系統,它使用 SQL 來組織儲存的資料。 |
2 | Java 教程 | Java 是一種面向物件且與平臺無關的程式語言。 |
3 | Hadoop 教程 | Hadoop 是一個用於處理大型資料集的框架。 |
4 | 大資料教程 | 大資料是指具有更大數量和更廣泛種類的資料集的資料。 |
5 | JDBC 教程 | JDBC 是一種基於 Java 的技術,用於資料庫連線。 |
使用自然語言模式在全文搜尋中搜索與資料相關的文章記錄,關鍵詞為“資料集”。
SELECT * FROM ARTICLES WHERE MATCH(ARTICLE_TITLE, DESCRIPTION) AGAINST ('data set' IN NATURAL LANGUAGE MODE);
輸出
以下是輸出:
ID | ARTICLE_TITLE | DESCRIPTION |
---|---|---|
4 | 大資料教程 | 大資料是指具有更大數量和更廣泛種類的資料集的資料。 |
1 | MySQL 教程 | MySQL 是一種關係資料庫系統,它使用 SQL 來組織儲存的資料。 |
3 | Hadoop 教程 | Hadoop 是一個用於處理大型資料集的框架。 |
如上所示,在表中存在的所有文章中,獲得了三個與術語“資料集”相關的搜尋結果,並按其相關性順序排列。但請注意,關鍵詞“資料集”在“MySQL 教程”文章記錄中並非完全匹配,它仍然被檢索到,因為 MySQL 也處理資料集。
搜尋中的停用詞
自然語言全文搜尋使用 tf-idf 演算法,其中“tf”指詞頻,“idf”指逆文件頻率。搜尋指的是一個詞在一個文件中的頻率,以及該詞出現在多少個文件中。但是,搜尋通常會忽略某些詞,例如字元數少於一定數量的詞。InnoDB 忽略少於 3 個字元的詞,而 MyISAM 忽略少於 4 個字元的詞。這些詞被稱為停用詞(the、a、an、are 等)。
示例
在下面的示例中,我們將在上面建立的 ARTICLES 表上執行簡單的自然語言全文搜尋。讓我們看看停用詞如何透過針對兩個關鍵詞“Big Tutorial”和“is Tutorial”進行搜尋來影響全文搜尋。
搜尋“Big Tutorial”
以下查詢在自然語言模式下針對關鍵詞“Big Tutorial”執行全文搜尋:
SELECT ARTICLE_TITLE, DESCRIPTION FROM ARTICLES WHERE MATCH(ARTICLE_TITLE, DESCRIPTION) AGAINST ('Big Tutorial' IN NATURAL LANGUAGE MODE);
輸出
獲得的輸出為:
ARTICLE_TITLE | DESCRIPTION |
---|---|
大資料教程 | 大資料是指具有更大數量和更廣泛種類的資料集的資料。 |
MySQL 教程 | MySQL 是一種關係資料庫系統,它使用 SQL 來組織儲存的資料。 |
Java 教程 | Java 是一種面向物件且與平臺無關的程式語言。 |
Hadoop 教程 | Hadoop 是一個用於處理大型資料集的框架。 |
JDBC 教程 | JDBC 是一種基於 Java 的技術,用於資料庫連線。 |
搜尋“is Tutorial”
以下查詢在自然語言模式下針對關鍵詞“is Tutorial”執行全文搜尋:
SELECT ARTICLE_TITLE, DESCRIPTION FROM Articles WHERE MATCH(ARTICLE_TITLE, DESCRIPTION) AGAINST ('is Tutorial' IN NATURAL LANGUAGE MODE);
輸出
獲得的輸出為:
ARTICLE_TITLE | DESCRIPTION |
---|---|
MySQL 教程 | MySQL 是一種關係資料庫系統,它使用 SQL 來組織儲存的資料。 |
Java 教程 | Java 是一種面向物件且與平臺無關的程式語言。 |
Hadoop 教程 | Hadoop 是一個用於處理大型資料集的框架。 |
大資料教程 | 大資料是指具有更大數量和更廣泛種類的資料集的資料。 |
JDBC 教程 | JDBC 是一種基於 Java 的技術,用於資料庫連線。 |
如上例所示,由於單詞“Tutorial”出現在表格的所有記錄中,因此在這兩種情況下都會檢索到所有記錄。但是,相關性的順序由指定的關鍵字的第二個單詞決定。
在第一種情況下,由於“Big Data Tutorial”中存在單詞“Big”,因此該記錄首先被檢索。在第二種情況下,結果集中的記錄順序與原始表格的順序相同,因為單詞“is”是停用詞,所以被忽略。
使用客戶端程式進行自然語言全文搜尋
我們還可以使用客戶端程式在 MySQL 資料庫上執行自然語言全文搜尋操作。
語法
要透過 PHP 程式執行自然語言全文搜尋,我們需要使用mysqli函式query()執行以下 SELECT 語句:
$sql = "SELECT * FROM Articles WHERE MATCH(ARTICLE_TITLE, DESCRIPTION) AGAINST ('data set' IN NATURAL LANGUAGE MODE)"; $mysqli->query($sql);
要透過 JavaScript 程式執行自然語言全文搜尋,我們需要使用mysql2庫的query()函式執行以下 SELECT 語句:
sql = `SELECT * FROM Articles WHERE MATCH(ARTICLE_TITLE, DESCRIPTION) AGAINST ('data set' IN NATURAL LANGUAGE MODE)`; con.query(sql);
要透過 Java 程式執行自然語言全文搜尋,我們需要使用JDBC函式executeQuery()執行 SELECT 語句:
String sql = "SELECT * FROM Articles WHERE MATCH(ARTICLE_TITLE, DESCRIPTION) AGAINST ('data set' IN NATURAL LANGUAGE MODE)"; statement.executeQuery(sql);
要透過 Python 程式執行自然語言全文搜尋,我們需要使用MySQL Connector/Python的execute()函式執行 SELECT 語句:
natural_language_search_query = 'SELECT * FROM Articles WHERE MATCH(ARTICLE_TITLE, DESCRIPTION) AGAINST ('data set' IN NATURAL LANGUAGE MODE)' cursorObj.execute(natural_language_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.
'); $s = "SELECT * FROM Articles WHERE MATCH(ARTICLE_TITLE, DESCRIPTION) AGAINST ('data set' IN NATURAL LANGUAGE 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 Records: ID: 4, Title: Big Data Tutorial, Descriptions: Big Data refers to data that has wider variety of data sets in larger numbers ID: 1, Title: MySQL Tutorial, Descriptions: MySQL is a relational database system that uses SQL to structure data stored ID: 3, Title: Hadoop Tutorial, Descriptions: Hadoop is framework that is used to process large sets of data
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); //display the table details!... sql = `SELECT * FROM Articles WHERE MATCH(ARTICLE_TITLE, DESCRIPTION) AGAINST ('data set' IN NATURAL LANGUAGE MODE)`; con.query(sql, function (err, result) { if (err) throw err; console.log(result); }); });
輸出
獲得的輸出如下所示:
We get the following output, after executing the above NodeJs Program. [ { id: 4, ARTICLE_TITLE: 'Big Data Tutorial', DESCRIPTION: 'Big Data refers to data that has wider variety of data sets in larger numbers' }, { id: 1, ARTICLE_TITLE: 'MySQL Tutorial', DESCRIPTION: 'MySQL is a relational database system that uses SQL to structure data stored' }, { id: 3, ARTICLE_TITLE: 'Hadoop Tutorial', DESCRIPTION: 'Hadoop is framework that is used to process large sets of data' } ]
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class NaturalLanguageSearch { 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...!"); //displaying the fulltext records in the Natural language mode: ResultSet resultSet = statement.executeQuery("SELECT * FROM Articles WHERE MATCH(ARTICLE_TITLE, descriptions) AGAINST ('data set' IN NATURAL LANGUAGE 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...! 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
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() natural_language_search_query = ''' SELECT * FROM Articles WHERE MATCH(ARTICLE_TITLE, DESCRIPTION) AGAINST ('data set' IN NATURAL LANGUAGE MODE) ''' cursorObj.execute(natural_language_search_query) # Fetching all the results results = cursorObj.fetchall() # Display the result print("NATURAL LANGUAGE search results:") for row in results: print(row) cursorObj.close() connection.close()
輸出
獲得的輸出如下所示:
NATURAL LANGUAGE 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')