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_TITLEDESCRIPTION 列上定義了全文索引。現在,讓我們將值插入到上面建立的表中:

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')
廣告