MySQL - 查詢擴充套件全文搜尋



在像 MySQL 這樣的關係資料庫中,全文搜尋是一種用於檢索可能並不完全匹配搜尋關鍵詞的結果集的技術。這種型別的搜尋在搜尋關鍵詞與使用者期望的結果不匹配的情況下非常有用。因此,這種搜尋技術旨在提高搜尋相關性,以減少搜尋查詢和搜尋結果之間的準確性差距。因此,搜尋結果按與搜尋關鍵詞的相關性從高到低顯示。

全文搜尋使用三種搜尋模式:

  • 自然語言模式

  • 查詢擴充套件模式

  • 布林模式

使用者搜尋時總是基於其有限的知識。因此,在某些情況下,搜尋關鍵詞太短而無法進行適當的搜尋。這就是盲目擴充套件搜尋技術發揮作用的地方。

盲目擴充套件搜尋,也稱為自動相關反饋,用於根據與原始關鍵詞密切相關的其他關鍵詞來擴充套件搜尋結果。它使用“WITH QUERY EXPANSION”搜尋短語啟用。

在這種情況下,搜尋將執行兩次,按照以下步驟:

步驟 1 - 首先搜尋所有匹配給定搜尋關鍵詞的行。

步驟 2 - 然後檢查這些獲得的行中與原始關鍵詞相關的詞。

步驟 3 - 最後,根據這些相關詞而不是使用者指定的原始關鍵詞再次搜尋這些行。

要在資料庫表上執行查詢擴充套件全文搜尋,必須在 AGAINST() 函式中指定 WITH QUERY EXPANSION 或 IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION 搜尋修飾符。

示例

讓我們在下面的示例中瞭解如何在資料庫表上執行查詢擴充套件全文搜尋。

為此,我們將首先建立一個名為 DBMS_TUTORIALS 的表,其中包含文章的標題和描述。FULLTEXT 索引應用於文字列 TUTORIAL_TITLE 和 DESCRIPTIONS,如下所示:

CREATE TABLE DBMS_TUTORIALS(
   TUTORIAL_TITLE VARCHAR(200), 
   DESCRIPTIONS TEXT, 
   FULLTEXT(TUTORIAL_TITLE, DESCRIPTIONS)
);

現在,讓我們使用以下查詢將有關教程的詳細資訊(例如其標題和描述)插入此表:

INSERT INTO DBMS_TUTORIALS VALUES 
('MySQL Tutorial', 'MySQL is an RDBMS that uses SQL to structure the data stored'),
('ORACLE Tutorial', 'ORACLE is an RDBMS that uses SQL to structure the data stored'),
('MySQL Security', 'MySQL Database can store sensitive data, so security is required'),
('MySQL vs MariaDB', 'Comparing two databases...'),
('JDBC Tutorial', 'In this Java-based database connectivity...');

表建立如下:

TUTORIAL_TITLE DESCRIPTIONS
MySQL 教程 MySQL 是一個使用 SQL 來組織儲存資料的 RDBMS
ORACLE 教程 ORACLE 是一個使用 SQL 來組織儲存資料的 RDBMS
MySQL 安全性 MySQL 資料庫可以儲存敏感資料,因此需要安全性
MySQL vs MariaDB 比較兩個資料庫……
JDBC 教程 在這個基於 Java 的資料庫連線中……

使用全文搜尋中的查詢擴充套件模式,我們搜尋與資料相關的文章記錄,關鍵詞為“RDBMS”

SELECT * FROM DBMS_TUTORIALS 
WHERE MATCH(TUTORIAL_TITLE, DESCRIPTIONS) 
AGAINST ('RDBMS' WITH QUERY EXPANSION);

輸出

獲得的輸出如下:

TUTORIAL_TITLE DESCRIPTIONS
ORACLE 教程 ORACLE 是一個使用 SQL 來組織儲存資料的 RDBMS
MySQL 教程 MySQL 是一個使用 SQL 來組織儲存資料的 RDBMS
MySQL 安全性 MySQL 資料庫可以儲存敏感資料,因此需要安全性
MySQL vs MariaDB 比較兩個資料庫……
JDBC 教程 在這個基於 Java 的資料庫連線中……

IN NATURAL LANGUAGE MODE

在上表獲得的結果集中,所有教程記錄都與資料庫相關,這就是查詢根據相關性檢索所有記錄的原因。

SELECT * FROM DBMS_TUTORIALS 
WHERE MATCH(TUTORIAL_TITLE, DESCRIPTIONS) 
AGAINST ('Security' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION);

輸出

獲得的輸出如下:

TUTORIAL_TITLE DESCRIPTIONS
MySQL 安全性 MySQL 資料庫可以儲存敏感資料,因此需要安全性
JDBC 教程 在這個基於 Java 的資料庫連線中……
MySQL 教程 MySQL 是一個使用 SQL 來組織儲存資料的 RDBMS
ORACLE 教程 ORACLE 是一個使用 SQL 來組織儲存資料的 RDBMS
MySQL vs MariaDB 比較兩個資料庫……

在這個結果集中,即使搜尋關鍵詞是“安全性”,實際與安全性相關的教程只有“MySQL 安全性”和“JDBC 教程”,因此它們首先被檢索。這些記錄之後是作為擴充套件查詢的資料庫相關記錄。

使用客戶端程式進行查詢擴充套件全文搜尋

我們也可以使用客戶端程式執行查詢擴充套件全文搜尋操作。

語法

要透過 PHP 程式執行查詢擴充套件全文搜尋,我們需要使用mysqli函式query()執行 SELECT 語句,如下所示:

$sql = "SELECT * FROM DBMS_TUTORIALS WHERE MATCH(TUTORIAL_TITLE, DESCRIPTIONS) AGAINST ('RDBMS' WITH QUERY EXPANSION)";
$mysqli->query($sql);

要透過 JavaScript 程式執行查詢擴充套件全文搜尋,我們需要使用mysql2庫的query()函式執行 SELECT 語句,如下所示:

sql = "SELECT * FROM DBMS_TUTORIALS WHERE MATCH(TUTORIAL_TITLE, DESCRIPTIONS) AGAINST ('RDBMS' WITH QUERY EXPANSION)";
con.query(sql);

要透過 Java 程式執行查詢擴充套件全文搜尋,我們需要使用JDBC函式executeQuery()執行 SELECT 語句,如下所示:

String sql = "SELECT * FROM DBMS_TUTORIALS WHERE MATCH(TUTORIAL_TITLE, DESCRIPTIONS) AGAINST ('RDBMS' WITH QUERY EXPANSION)";
statement.executeQuery(sql);

要透過 Python 程式執行查詢擴充套件全文搜尋,我們需要使用MySQL Connector/Pythonexecute()函式執行 SELECT 語句,如下所示:

queryexpansionfulltext_search = 'SELECT * FROM DBMS_TUTORIALS WHERE MATCH(TUTORIAL_TITLE, DESCRIPTIONS)  AGAINST ('RDBMS' WITH QUERY EXPANSION)'
cursorObj.execute(queryexpansionfulltext_search)

示例

以下是程式:

$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.
'); /*CREATE Table*/ $sql = "CREATE TABLE DBMS_TUTORIALS(TUTORIAL_TITLE VARCHAR(200), DESCRIPTIONS TEXT, FULLTEXT(TUTORIAL_TITLE, DESCRIPTIONS))"; $result = $mysqli->query($sql); if ($result) { printf("Table created successfully...!\n"); } //insert data $q = "INSERT INTO DBMS_TUTORIALS (TUTORIAL_TITLE , DESCRIPTIONS) VALUES ('MySQL Tutorial', 'MySQL is an RDBMS that uses SQL to structure the data stored'), ('ORACLE Tutorial', 'ORACLE is an RDBMS that uses SQL to structure the data stored'), ('MySQL Security', 'MySQL Database can store sensitive data, so security is required'), ('MySQL vs MariaDB', 'Comparing two databases...'), ('JDBC Tutorial', 'In this Java-based database connectivity...')"; if ($res = $mysqli->query($q)) { printf("Data inserted successfully...!\n"); } //Using the Query Expansion Mode in Full-text search, try to search for records of DBMS_TUTORIALS relevant to data, with the keyword 'RDBMS' $s = "SELECT * FROM DBMS_TUTORIALS WHERE MATCH(TUTORIAL_TITLE, DESCRIPTIONS) AGAINST ('RDBMS' WITH QUERY EXPANSION)"; if ($r = $mysqli->query($s)) { printf("Table Records: \n"); while ($row = $r->fetch_assoc()) { printf("Tutorial_title: %s, Descriptions: %s", $row["TUTORIAL_TITLE"], $row["DESCRIPTIONS"]); printf("\n"); } } else { printf('Failed'); } $mysqli->close();

輸出

獲得的輸出如下所示:

Table created successfully...!
Data inserted successfully...!
Table Records:
Tutorial_title: ORACLE Tutorial, Descriptions: ORACLE is an RDBMS that uses SQL to structure the data stored
Tutorial_title: MySQL Tutorial, Descriptions: MySQL is an RDBMS that uses SQL to structure the data stored
Tutorial_title: MySQL Security, Descriptions: MySQL Database can store sensitive data, so security is required
Tutorial_title: MySQL vs MariaDB, Descriptions: Comparing two databases...
Tutorial_title: JDBC Tutorial, Descriptions: In this Java-based database connectivity...
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);

  //create a table...
  sql =
    "CREATE TABLE DBMS_TUTORIALS(TUTORIAL_TITLE VARCHAR(200), DESCRIPTIONS TEXT, FULLTEXT(TUTORIAL_TITLE, DESCRIPTIONS))";
  con.query(sql);

  //insert data
  sql = `INSERT INTO DBMS_TUTORIALS (TUTORIAL_TITLE , DESCRIPTIONS) VALUES 
  ('MySQL Tutorial', 'MySQL is an RDBMS that uses SQL to structure the data stored'), 
  ('ORACLE Tutorial', 'ORACLE is an RDBMS that uses SQL to structure the data stored'), 
  ('MySQL Security', 'MySQL Database can store sensitive data, so security is required'), 
  ('MySQL vs MariaDB', 'Comparing two databases...'), 
  ('JDBC Tutorial', 'In this Java-based database connectivity...')`;

  con.query(sql);

  //Using the Query Expansion Mode in Full-text search, try to search for records of DBMS_TUTORIALS relevant to data, with the keyword 'RDBMS'
  sql = "SELECT * FROM DBMS_TUTORIALS WHERE MATCH(TUTORIAL_TITLE, DESCRIPTIONS) AGAINST ('RDBMS' WITH QUERY EXPANSION)";
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log(result);
  });
});               

輸出

獲得的輸出如下所示:

[
    {
      TUTORIAL_TITLE: 'ORACLE Tutorial',
      DESCRIPTIONS: 'ORACLE is an RDBMS that uses SQL to structure the data stored'
    },
    {
      TUTORIAL_TITLE: 'MySQL Tutorial',
      DESCRIPTIONS: 'MySQL is an RDBMS that uses SQL to structure the data stored'
    },
    {
      TUTORIAL_TITLE: 'MySQL Security',
      DESCRIPTIONS: 'MySQL Database can store sensitive data, so security is required'
    },
    {
      TUTORIAL_TITLE: 'MySQL vs MariaDB',
      DESCRIPTIONS: 'Comparing two databases...'
    },
    {
      TUTORIAL_TITLE: 'JDBC Tutorial',
      DESCRIPTIONS: 'In this Java-based database connectivity...'
    }
]
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class QeFSearch {
   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 DBMS_TUTORIALS(TUTORIAL_TITLE VARCHAR(200), DESCRIPTIONS TEXT, FULLTEXT(TUTORIAL_TITLE, DESCRIPTIONS))";
         statement.execute(sql);
         System.out.println("Table created successfully...!");

         //inserting data to the table
         String insert = "INSERT INTO DBMS_TUTORIALS (TUTORIAL_TITLE , DESCRIPTIONS) VALUES" + 
         "('MySQL Tutorial', 'MySQL is an RDBMS that uses SQL to structure the data stored')," + 
         "('ORACLE Tutorial', 'ORACLE is an RDBMS that uses SQL to structure the data stored')," + 
         "('MySQL Security', 'MySQL Database can store sensitive data, so security is required')," + 
         "('MySQL vs MariaDB', 'Comparing two databases...')," + 
         "('JDBC Tutorial', 'In this Java-based database connectivity...')";
         statement.execute(insert);
         System.out.println("Data inserted successfully...!");

         //Using the Query Expansion Mode in Full-text search, try to search for records of DBMS_TUTORIALS relevant to data, with the keyword 'RDBMS'...!
         ResultSet resultSet = statement.executeQuery("SELECT * FROM DBMS_TUTORIALS WHERE MATCH(TUTORIAL_TITLE, DESCRIPTIONS) AGAINST ('RDBMS' WITH QUERY EXPANSION)");
         while (resultSet.next()){
            System.out.println(resultSet.getString(1)+" "+resultSet.getString(2));
         }
         connection.close();
      } catch (Exception e) {
         System.out.println(e);
      }
   }
}

輸出

獲得的輸出如下所示:

Connected successfully...!
Table created successfully...!
Data inserted successfully...!
ORACLE Tutorial ORACLE is an RDBMS that uses SQL to structure the data stored
MySQL Tutorial MySQL is an RDBMS that uses SQL to structure the data stored
MySQL Security MySQL Database can store sensitive data, so security is required
MySQL vs MariaDB Comparing two databases...
JDBC Tutorial in this Java-based database connectivity... 
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()
queryexpansionfulltext_search = '''
SELECT * FROM DBMS_TUTORIALS 
WHERE MATCH(TUTORIAL_TITLE, DESCRIPTIONS) 
AGAINST ('RDBMS' WITH QUERY EXPANSION)
'''
cursorObj.execute(queryexpansionfulltext_search)
# Fetching all the results
results = cursorObj.fetchall()
# Display the result
print("Query expansion Fulltext search results:")
for row in results:
    print(row)
cursorObj.close()
connection.close()

輸出

獲得的輸出如下所示:

Query expansion Fulltext search results:
('ORACLE Tutorial', 'ORACLE is an RDBMS that uses SQL to structure the data stored')
('MySQL Tutorial', 'MySQL is an RDBMS that uses SQL to structure the data stored')
('MySQL Security', 'MySQL Database can store sensitive data, so security is required')
('MySQL vs MariaDB', 'Comparing two databases...')
('JDBC Tutorial', 'In this Java-based database connectivity...')
廣告