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/Pythonexecute()函式執行 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')
廣告