全部產品
Search
文件中心

AnalyticDB:全文檢索索引

更新時間:Nov 06, 2024

本文介紹如何通過全文索引函數match() against()match() fuzzy()match() phrase()進行全文檢索索引以及如何高亮全文檢索索引關鍵詞。

前提條件

已建立全文索引。如何建立,請參見建立全文索引

樣本資料

本文所有樣本均基於樣本表tbl_fulltext_demo。每個全文索引都使用了不同的分詞器,樣本表的建表語句和資料寫入語句如下。

CREATE TABLE `tbl_fulltext_demo` (
  `id` int,
  `content` varchar,
  `content_alinlp` varchar,
  `content_ik` varchar,
  `content_standard` varchar,
  `content_ngram` varchar,
  FULLTEXT INDEX fidx_c(`content`),  // 使用預設分詞器
  FULLTEXT INDEX fidx_alinlp(`content_alinlp`) WITH ANALYZER alinlp,
  FULLTEXT INDEX fidx_ik(`content_ik`) WITH ANALYZER ik,
  FULLTEXT INDEX fidx_standard(`content_standard`) WITH ANALYZER standard,
  FULLTEXT INDEX fidx_ngram(`content_ngram`) WITH ANALYZER ngram,
  PRIMARY KEY (`id`)
) DISTRIBUTED BY HASH(id);



INSERT INTO tbl_fulltext_demo(id, content, content_alinlp, content_ik, content_standard, content_ngram) 
VALUES(1, '客戶需要更好的產品和服務', '客戶需要更好的產品和服務', '客戶需要更好的產品和服務', '客戶需要更好的產品和服務', '客戶需要更好的產品和服務')
,(2, '武漢市長江大橋','武漢市長江大橋','武漢市長江大橋','武漢市長江大橋', '武漢市長江大橋')
,(3, 'Hangzhou, Zhejiang Province','Hangzhou, Zhejiang Province', 'Hangzhou, Zhejiang Province', 'Hangzhou, Zhejiang Province', 'Hangzhou, Zhejiang Province')
,(4, '產品的使用者價值和商業價值','產品的使用者價值和商業價值', '產品的使用者價值和商業價值', '產品的使用者價值和商業價值', '產品的使用者價值和商業價值');
                

注意事項

  • 全文索引函數支援使用特殊字元+-&|!(){}[]^"~*?:\/,但需要對特殊字元進行轉義處理,轉義符為\\

    例如,需要檢索包含春天/美景的資料,錯誤寫法為match(content) against('春天 / 美景' ),正確寫法為match(content) against('春天 \\/ 美景')

  • 全文索引函數不支援=!=betweenis nullis not null以及like等操作符。

match() against()

match() against()支援詞條匹配和精確匹配,對指定列尋找與關鍵詞匹配的內容。

文法

SELECT * FROM `table_name` WHERE match (column_name[ , ... ]) against('term')

參數說明

  • table_name:檢索的資料表。

  • column_name:檢索的資料列。如果對多個列進行檢索,列名之間用英文逗號(,)隔開。

  • term:檢索的關鍵詞。關鍵詞查詢時支援如下邏輯操作符:

    • AND:檢索出同時匹配所有關鍵詞的內容。

    • OR:檢索出匹配其中一個關鍵詞的內容。

    • NOT:檢索出與邏輯操作符左側關鍵詞匹配,但與右側關鍵詞不匹配的內容。

    說明

    邏輯操作符不區分大小寫。

樣本一:單列查詢

SELECT id, content
FROM `tbl_fulltext_demo`
WHERE MATCH (`content`) AGAINST ('產品服務');

返回結果:

+------+--------------------------------------+
| id   | content                              |
+------+--------------------------------------+
| 4    |產品的使用者價值和商業價值              |
+------+--------------------------------------+
| 1    | 客戶需要更好的產品和服務             |
+------+--------------------------------------+

樣本二:多列查詢

在匹配多列時,不需要建立多列聯合索引,只要多列條件中的每一列具有全文索引,即可進行多列聯合全文索引查詢。

SELECT id, content, content_alinlp
FROM `tbl_fulltext_demo`
WHERE MATCH (content, content_alinlp) AGAINST ('服務');

SELECT id, content, content_alinlp
FROM `tbl_fulltext_demo`
WHERE MATCH (content) AGAINST ('服務')
OR MATCH (content_alinlp) AGAINST ('服務');
說明

以上兩個查詢語句的作用相同。

返回結果:

+------+-----------------------------+------------------------------+
| id   | content                     | content_alinlp               |
+------+-----------------------------+------------------------------+
| 1    | 客戶需要更好的產品和服務    | 客戶需要更好的產品和服務     |
+------+-----------------------------+------------------------------+

樣本三:布爾查詢

  • 使用AND邏輯操作符,檢索匹配所有關鍵詞的內容。

    SELECT * FROM `tbl_fulltext_demo` WHERE MATCH (content) AGAINST ('產品 AND 服務');

    返回結果:

    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
    | id   | content                        | content_alinlp                 | content_ik                  | content_standard                     | content_ngram                        |
    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
    |    1 | 客戶需要更好的產品和服務         | 客戶需要更好的產品和服務         | 客戶需要更好的產品和服務       | 客戶需要更好的產品和服務               | 客戶需要更好的產品和服務               |
    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
  • 使用OR操作符,檢索匹配任意關鍵詞的內容。

    SELECT * FROM `tbl_fulltext_demo` WHERE MATCH (content) AGAINST ('產品 OR 服務');

    返回結果:

    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
    | id   | content                        | content_alinlp                 | content_ik                  | content_standard                     | content_ngram                        |
    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
    |    4 | 產品的使用者價值和商業價值         | 產品的使用者價值和商業價值         | 產品的使用者價值和商業價值       |產品的使用者價值和商業價值                | 產品的使用者價值和商業價值               |
    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
    |    1 | 客戶需要更好的產品和服務         | 客戶需要更好的產品和服務         | 客戶需要更好的產品和服務       | 客戶需要更好的產品和服務               |  客戶需要更好的產品和服務              |
    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
  • 使用NOT操作符,檢索只匹配邏輯操作符左側關鍵詞的內容。

    SELECT * FROM `tbl_fulltext_demo` WHERE MATCH (content) AGAINST ('產品 NOT 服務');

    返回結果:

    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
    | id   | content                        | content_alinlp                 | content_ik                  | content_standard                     | content_ngram                        |
    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
    |    4 | 產品的使用者價值和商業價值         | 產品的使用者價值和商業價值          | 產品的使用者價值和商業價值      | 產品的使用者價值和商業價值               | 產品的使用者價值和商業價值               |
    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
  • 使用NOT操作符,檢索出與邏輯操作符右側關鍵詞不匹配的內容。

    SELECT * FROM `tbl_fulltext_demo` WHERE MATCH (content) AGAINST ('*:* NOT 服務');
    重要

    *:*表示所有JSON文檔,僅在邏輯操作符的左側使用,並且只能放在運算式的起始位置。

    返回結果:

    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
    | id   |           content              |          content_alinlp        |          content_ik         |          content_standard            |       content_ngram                  |
    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
    |    2 |        武漢市長江大橋          |        武漢市長江大橋          |         武漢市長江大橋      |         武漢市長江大橋               |            武漢市長江大橋             |
    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
    |    4 |    產品的使用者價值和商業價值    |    產品的使用者價值和商業價值    |  產品的使用者價值和商業價值   |     產品的使用者價值和商業價值          |       產品的使用者價值和商業價值       |
    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
    |    3 |  Hangzhou, Zhejiang Province   | Hangzhou, Zhejiang Province    | Hangzhou, Zhejiang Province |      Hangzhou, Zhejiang Province     |      Hangzhou, Zhejiang Province     |
    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
  • 使用括弧構造複雜的布爾查詢:

    SELECT id, content_alinlp
    FROM `tbl_fulltext_demo`
    WHERE MATCH (content_alinlp) AGAINST ('(武漢 OR 杭州) AND (大橋 OR 西湖)');

    返回結果:

    +------+-----------------------+
    | id   | content_alinlp        |
    +------+-----------------------+
    |    2 | 武漢市長江大橋         |
    +------+-----------------------+

樣本四:結果集過濾

全文檢索索引會返回所有跟關鍵詞近似的結果。在某些資料量很大的情境中,查詢關鍵詞的結果集也很大,但是只需要取出近似度較高的結果,因此AnalyticDB for MySQL提供了結果集過濾的功能。

以下樣本過濾掉90%的低近似度結果,只返回近似度排在前10%的結果。

SELECT id, content
FROM `tbl_fulltext_demo`
WHERE MATCH (content) AGAINST ('產品服務') > 0.9;

返回結果:

+------+--------------------------------------+
| id   | content                              |
+------+--------------------------------------+
|    4 | 產品的使用者價值和商業價值               |
+------+--------------------------------------+
|    1 | 客戶需要更好的產品和服務               |
+------+--------------------------------------+

樣本五:近似度分數與排序

AnalyticDB for MySQL支援擷取結果集的近似度分數,以及按照近似度分數排序的功能。

  • 查詢近似度分數。

    SELECT id, content, MATCH (content) AGAINST ('產品服務') AS score
    FROM `tbl_fulltext_demo`
    WHERE MATCH (content) AGAINST ('產品服務') > 0.9;
    說明

    WHERE MATCH (content) AGAINST ('產品服務') > 0.9表示過濾掉90%的低近似度結果,只返回近似度排在前10%的結果。

    預設情況下,返回的結果集不會按照近似度分數排序:

    +------+--------------------------------------+----------------------+
    | id   | content                              | score                |
    +------+--------------------------------------+----------------------+
    |    4 | 產品的使用者價值和商業價值               | 0.13076457381248474  |
    +------+--------------------------------------+----------------------+
    |    1 | 客戶需要更好的產品和服務               | 1.1090354919433594   |
    +------+--------------------------------------+----------------------+

    SELECT投影中的match(content) against ('武漢') 不需要和WHERE查詢條件中的match(content) against ('產品服務') 語句保持一致。以下語句可以查詢match(content) against ('武漢') 的近似度分數。

    SELECT *, MATCH (content) AGAINST ('武漢') AS score
    FROM `tbl_fulltext_demo`
    WHERE MATCH (content) AGAINST ('產品服務') > 0.9
    ORDER BY score DESC;

    返回結果:

    +------+--------------------------------+--------------------------------+-----------------------------+-------------------------------------+--------------------------------------+-------------+
    | id   | content                        | content_alinlp                 | content_ik                  | content_standard                    | content_ngram                        |score        |
    +------+--------------------------------+--------------------------------+-----------------------------+-------------------------------------+--------------------------------------+-------------+
    |    4 | 產品的使用者價值和商業價值         | 產品的使用者價值和商業價值         | 產品的使用者價值和商業價值       | 產品的使用者價值和商業價值              | 產品的使用者價值和商業價值               |0.0          |
    +------+--------------------------------+--------------------------------+-----------------------------+-------------------------------------+--------------------------------------+-------------+
    |    1 | 客戶需要更好的產品和服務         | 客戶需要更好的產品和服務         | 客戶需要更好的產品和服務       |客戶需要更好的產品和服務               |  客戶需要更好的產品和服務              |0.0          |
    +------+--------------------------------+--------------------------------+-----------------------------+-------------------------------------+--------------------------------------+-------------+
  • 按近似度排序。

    使用ORDER BY語句,並按近似度降序排序。

    SELECT id, content, MATCH (content) AGAINST ('產品服務') AS score
    FROM `tbl_fulltext_demo`
    WHERE MATCH (content) AGAINST ('產品服務') > 0.9
    ORDER BY score DESC;

    返回結果:

    +------+--------------------------------------+---------------------+
    | id   | content                              | score               |
    +------+--------------------------------------+---------------------+
    |    1 | 客戶需要更好的產品和服務               | 1.1090354919433594  |
    +------+--------------------------------------+---------------------+
    |    4 | 產品的使用者價值和商業價值               | 0.13076457381248474 |
    +------+--------------------------------------+---------------------+

樣本六:詞條匹配

預設情況下,全文檢索索引會先對詞語進行分詞後,再進行檢索。如果關鍵詞不添加雙引號,查詢結果只需要與任意一個關鍵詞匹配,就可以返回結果。

Alinlp分詞器將“產品和服務”分詞為“產品”、“和”與“服務”,將“產品服務”分詞為“產品”與“服務”。

SELECT id, content_alinlp, MATCH (content_alinlp) AGAINST ('產品服務') AS score
FROM `tbl_fulltext_demo`
WHERE MATCH (content_alinlp) AGAINST ('產品服務') > 0.9
ORDER BY score DESC;

只需要匹配“產品服務”中的任意一個關鍵詞,就能得到返回結果:

+------+--------------------------------------+---------------------+
| id   | content_alinlp                       | score               |
+------+--------------------------------------+---------------------+
|    1 | 客戶需要更好的產品和服務               | 0.5953410863876343  |
+------+--------------------------------------+---------------------+
|    4 | 產品的使用者價值和商業價值               | 0.13076457381248474 |
+------+--------------------------------------+---------------------+

樣本七:精確匹配

如果關鍵詞添加雙引號,分詞器不會對雙引號中的關鍵詞進行分詞,指定列中的資料需要完全符合雙引號中的關鍵詞,才能返回結果。

  • 檢索與關鍵詞產品服務精確匹配的內容。

    SELECT id, content_alinlp, MATCH (content_alinlp) AGAINST ('"產品服務"') AS score
    FROM `tbl_fulltext_demo`
    WHERE MATCH (content_alinlp) AGAINST ('"產品服務"') > 0.9
    ORDER BY score DESC;

    精確匹配關鍵詞“產品服務”的返回結果為空白:

    Empty set
  • 檢索與關鍵詞產品和服務精確匹配的內容。

    SELECT id, content_alinlp, MATCH (content_alinlp) AGAINST ('"產品和服務"') AS score
    FROM `tbl_fulltext_demo`
    WHERE MATCH (content_alinlp) AGAINST ('"產品和服務"') > 0.9
    ORDER BY score DESC; 

    返回結果:

    +------+--------------------------------------+--------------------+
    | id   | content_alinlp                       | score              |
    +------+--------------------------------------+--------------------+
    |    1 | 客戶需要更好的產品和服務               | 0.8930116891860962 |
    +------+--------------------------------------+--------------------+

match() fuzzy()

match()fuzzy()支援模糊比對查詢,基於Levenshtein Edit Distance(萊溫斯坦編輯距離),對檢索的文本進行模糊比對。在一些輸入出現錯誤的情境下,使用模糊比對查詢功能可以在一定程度上查詢出與關鍵詞相近的內容。

文法

SELECT * FROM `table_name` WHERE match (`column_name`) fuzzy('term') [max_edits(n)];

參數說明

  • table_name:檢索的資料表。

  • column_name:檢索的資料列。

  • term:檢索的關鍵詞。

  • max_edits(n):最大編輯距離(可選),也就是字串A變成字串B所需要的最小變化(插入,刪除或者替換)的次數。預設值為2,取值範圍是0~2之間的整數。例如:windos進行1次變化,插入字元w,變成windows,所以windoswindows最大編輯距離為1。

樣本一:相近查詢

SELECT id, content
FROM tbl_fulltext_demo
WHERE MATCH(content_standard) FUZZY('hangzou');

返回結果:

+------+-----------------------------+
| id   | content                     |
+------+-----------------------------+
|    3 | Hangzhou, Zhejiang Province |
+------+-----------------------------+

樣本二:編輯距離為1的相近查詢

SELECT id, content
FROM tbl_fulltext_demo
WHERE MATCH(content_standard) FUZZY('hangzou') max_edits(1);

返回結果:

+------+-----------------------------+
| id   | content                     |
+------+-----------------------------+
|    3 | Hangzhou, Zhejiang Province |
+------+-----------------------------+

樣本三:編輯距離為2的相近查詢

SELECT id, content
FROM tbl_fulltext_demo
WHERE MATCH(content_standard) FUZZY('武漢長') max_edits(2);

返回結果:

+------+-----------------------+
| id   | content               |
+------+-----------------------+
|    2 | 武漢市長江大橋         |
+------+-----------------------+

match() phrase()

match() phrase()支援短語查詢,對指定列尋找匹配多個關鍵詞的內容。在多個關鍵詞都匹配的情況下,您可以將slop參數作為判斷是否滿足短語查詢的另一個依據。

文法

SELECT * FROM `table_name` WHERE match (`column_name`) phrase('term1 term2') [slop(n)]

參數說明

  • table_name:檢索的資料表。

  • column_name:檢索的資料列。

  • term1 term2:檢索的關鍵詞列表,關鍵詞之間用空格隔開,關鍵詞的順序將影響匹配的結果。

  • slop(n):最大移動步長(可選)。使用分詞器對文本分詞得到詞條列表後,按照順序對每個詞條從0開始依次遞增標記序號位置,通過左右移動詞條使其與phrase參數指定的關鍵詞列表匹配。預設值是0,取值範圍是0~6之間的整數。例如,對“商品和服務”使用Standard分詞器分詞,結果是“商”、“品”、“和”、“服”和“務”。

    文本

    序號位置

    0

    1

    2

    3

    4

    • phrase('商 和'):slop距離是1,表示“商”往右移動1個步長或“和”往左移動1個步長。

    • phrase('商 服'):slop距離是2,表示“商”往右移動2個步長或“服”往左移動2個步長。

樣本一:英文短語查詢

AnalyticDB for MySQL內建的Standard分詞器,在預設配置的情況下對“Hangzhou, Zhejiang Province”分詞為“Hangzhou”、“Zhejiang”和“Province”。

  • 檢索與關鍵詞zhejiang hangzhou 匹配的內容。

    SELECT id, content
    FROM tbl_fulltext_demo
    WHERE MATCH(content_standard) PHRASE('zhejiang hangzhou');

    slop參數預設設定為0,檢索與關鍵詞zhejiang hangzhou 匹配的內容,返回結果為空白:

    Empty set
  • 檢索移動1個步長後與關鍵詞hangzhou Province匹配的內容。

    SELECT id, content
    FROM tbl_fulltext_demo
    WHERE MATCH(content_standard) PHRASE('hangzhou Province') slop(1);

    返回結果:

    +------+-----------------------------+
    | id   | content                     |
    +------+-----------------------------+
    |    3 | Hangzhou, Zhejiang Province |
    +------+-----------------------------+
  • 檢索移動2個步長後與關鍵詞zhejiang hangzhou匹配的內容。

    SELECT id, content
    FROM tbl_fulltext_demo
    WHERE MATCH(content_standard) PHRASE('zhejiang hangzhou') slop(2);

    返回結果:

    +------+-----------------------------+
    | id   | content                     |
    +------+-----------------------------+
    |    3 | Hangzhou, Zhejiang Province |
    +------+-----------------------------+

樣本二:中文短語查詢

match() phrase()中文短語匹配情境下,使用內建的Alinlp分詞器和Ngram分詞器分詞可能會導致中文匹配查詢資料失敗。因此推薦您使用Standard Analyzer分詞器和Ik Analyzer分詞器。

  • 檢索經過移動1個步長後與關鍵詞產品 服務匹配的內容。

    SELECT id, content
    FROM tbl_fulltext_demo
    WHERE MATCH(content_ik) PHRASE('產品 服務') slop(1);

    返回結果:

    +------+--------------------------------------+
    | id   | content                              |
    +------+--------------------------------------+
    |    1 | 客戶需要更好的產品和服務               |
    +------+--------------------------------------+
  • 檢索經過移動2個步長後與關鍵詞產 服匹配的內容。

    SELECT id, content
    FROM tbl_fulltext_demo
    WHERE MATCH(content_standard) PHRASE('產 服') slop(2);

    返回結果:

    +------+--------------------------------------+
    | id   | content                              |
    +------+--------------------------------------+
    |    1 | 客戶需要更好的產品和服務               |
    +------+--------------------------------------+

高亮支援

使用函數高亮

AnalyticDB for MySQL支援使用fulltext_highlight(`column_name`)函數對全文索引列中的關鍵詞進行高亮。

樣本一:MATCH() AGAINST()關鍵詞高亮

  • 對單列查詢進行高亮。

    SELECT MATCH (content_alinlp) AGAINST ('武漢長江') AS score, fulltext_highlight(content_alinlp)
    FROM tbl_fulltext_demo
    WHERE MATCH (content_alinlp) AGAINST ('武漢長江') > 0.9
    ORDER BY score DESC LIMIT 3;

    返回結果:

    +--------------------+-----------------------------------------+
    | score              | fulltext_highlight(content_alinlp)      |
    +--------------------+-----------------------------------------+
    | 0.2615291476249695 | <em>武漢</em>市<em>長江</em>大橋         |
    +--------------------+-----------------------------------------+
  • 對多列查詢進行高亮。

    SELECT MATCH (content_alinlp) AGAINST ('武漢長江') AS score, fulltext_highlight(content_alinlp)
    FROM tbl_fulltext_demo
    WHERE MATCH (content_alinlp) AGAINST ('武漢長江') > 0.9
    AND MATCH (content_alinlp) AGAINST ('大橋') > 0.9
    ORDER BY score DESC LIMIT 3;

    返回結果:

    +--------------------+--------------------------------------------------+
    | score              | fulltext_highlight(content_alinlp)               |
    +--------------------+--------------------------------------------------+
    | 0.2615291476249695 | <em>武漢</em>市<em>長江</em><em>大橋</em>         |
    +--------------------+--------------------------------------------------+

樣本二:MATCH() FUZZY()關鍵詞高亮

SELECT id, MATCH(content_standard) FUZZY('武漢長') as score, fulltext_highlight(content_standard)
FROM tbl_fulltext_demo
WHERE MATCH(content_standard) FUZZY('武漢長');

返回結果:

+------+-------+--------------------------------------------------+
| id   | score | fulltext_highlight(content_standard)             |
+------+-------+--------------------------------------------------+
|    2 |   0.0 | <em>武</em><em>漢</em>市<em>長</em>江大橋         |
+------+-------+--------------------------------------------------+

樣本三:MATCH() PHRASE()關鍵詞高亮

SELECT id, MATCH(content_ik) PHRASE('產品 服務') slop(1) as score, fulltext_highlight(content_ik)
FROM tbl_fulltext_demo
WHERE MATCH(content_ik) PHRASE('產品 服務') slop(1);

返回結果:

+------+--------------------+--------------------------------------------------------+
| id   | score              | fulltext_highlight(content_ik)                         |
+------+--------------------+--------------------------------------------------------+
|    1 | 0.6931471824645996 | 客戶需要更好的<em>產品</em>和<em>服務</em>               |
+------+--------------------+--------------------------------------------------------+

使用hint自訂高亮

AnalyticDB for MySQL全文檢索索引的高亮預設使用<em>和</em>標籤,您也可以使用hint設定fulltext_highlight_pre_tagfulltext_highlight_post_tag的值定義全文高亮的左右標籤。

樣本一:MATCH() AGAINST()自訂高亮

/*+ fulltext_highlight_pre_tag=<span>,fulltext_highlight_post_tag=</span>*/
SELECT MATCH (content_alinlp) AGAINST ('武漢長江') AS score, fulltext_highlight(content_alinlp)
FROM tbl_fulltext_demo
WHERE MATCH (content_alinlp) AGAINST ('武漢長江') > 0.9
ORDER BY score DESC LIMIT 3;

返回結果:

+--------------------+-------------------------------------------------+
| score              | fulltext_highlight(content_alinlp)              |
+--------------------+-------------------------------------------------+
| 0.2615291476249695 | <span>武漢</span>市<span>長江</span>大橋         |
+--------------------+-------------------------------------------------+

樣本二:MATCH() FUZZY()自訂高亮

/*+ fulltext_highlight_pre_tag=<span>,fulltext_highlight_post_tag=</span>*/
SELECT MATCH (content_alinlp) FUZZY ('武漢長江') AS score, fulltext_highlight(content_alinlp)
FROM tbl_fulltext_demo
WHERE MATCH (content_alinlp) FUZZY ('武漢長江') > 0.9
ORDER BY score DESC LIMIT 3;

返回結果:

+--------------------+-------------------------------------------------+
| score              | fulltext_highlight(content_alinlp)              |
+--------------------+-------------------------------------------------+
| 0.0                | <span>武漢</span>市<span>長江</span>大橋         |
+--------------------+-------------------------------------------------+

樣本三:MATCH() PHRASE()自訂高亮

/*+ fulltext_highlight_pre_tag=<span>,fulltext_highlight_post_tag=</span>*/
SELECT MATCH (content_alinlp) PHRASE ('武漢') AS score, fulltext_highlight(content_alinlp)
FROM tbl_fulltext_demo
WHERE MATCH (content_alinlp) PHRASE ('武漢') > 0.9
ORDER BY score DESC LIMIT 3;

返回結果:

+--------------------+---------------------------------------------------------------+
| score              | fulltext_highlight(content_alinlp)                            |
+--------------------+---------------------------------------------------------------+
| 0.8930116891860962 | 客戶需要更好的<span>產品</span><span>和</span><span>服務</span> |
+--------------------+---------------------------------------------------------------+