すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:全文検索

最終更新日:Sep 29, 2024

このトピックでは、全文インデックス関数MATCH() AGAINST()MATCH() FUZZY() 、およびMATCH() PHRASE() を使用して全文検索を実行し、全文検索キーワードを強調表示する方法について説明します。

前提条件

フルテキストインデックスが作成されます。 詳細については、「フルテキストインデックスの作成」をご参照ください。

サンプルデータ

この例では、tbl_fulltext_demoという名前のテーブルを作成してサンプルデータを提供します。 各フルテキストインデックスは異なるアナライザーを使用します。 次のSQL文を使用して、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`),  // Use the default analyzer.
  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`)
) DISTRIBUTE BY HASH(id);



INSERT INTO tbl_fulltext_demo(id, content, content_alinlp, content_ik, content_standard, content_ngram) 
VALUES(1, 'Customers Need Better Products and Services', 'Customers Need Better Products and Services', 'Customers Need Better Products and Services', 'Customers Need Better Products and Services', 'Customers Need Better Products and Services')
, (2, 'Wuhan Changjiang Bridge', 'Wuhan Changjiang Bridge', 'Wuhan Changjiang Bridge', 'Wuhan Changjiang Bridge', 'Wuhan Changjiang Bridge')
,(3, 'Hangzhou, Zhejiang Province','Hangzhou, Zhejiang Province', 'Hangzhou, Zhejiang Province', 'Hangzhou, Zhejiang Province', 'Hangzhou, Zhejiang Province')
,(4, 'User Values and Commercial Values of Products', 'User Values and Commercial Values of Products', 'User Values and Commercial Values of Products', 'User Values and Commercial Values of Products', 'User Values and Commercial Values of Products');
                

使用上の注意

  • フルテキストインデックス関数は特定の特殊文字をサポートしますが、特殊文字の前にエスケープ文字 \\ を使用する必要があります。 次の特殊文字がサポートされています: + - & |! ( ) { } [ ] ^ " ~ * ? : \ /.

    たとえば、Spring/Sceneryを含むコンテンツを検索します。 正しくない構文: MATCH(content) AGAINST('Spring / Scenery' ) 正しい構文: MATCH(content) AGAINST('Spring \\/ Scenery')

  • フルテキストインデックス関数は、=,!=,の間,IS NULL,IS NOT NULL、および好き.

match() against()

MATCH() AGAINST() 関数は、単語一致と完全一致をサポートします。 この機能を使用して、1つ以上の列からキーワードに一致するコンテンツを検索できます。

構文

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

パラメーター

  • table_name: 検索するテーブルの名前。

  • column_name: 検索する列の名前。 複数の列はコンマ (,) で区切ります。

  • term: 検索キーワード。 キーワード検索は、次の論理演算子をサポートします。

    • AND: すべてのキーワードに一致するコンテンツを検索します。

    • OR: キーワードの1つに一致するコンテンツを検索します。

    • NOT: 論理演算子の左側のキーワードと一致するが、右側のキーワードと一致しないコンテンツを検索します。

    説明

    論理演算子は大文字と小文字を区別しません。

例1: 単一列クエリの実行

SELECT id, content
FROM `tbl_fulltext_demo`
WHERE MATCH(`content`) AGAINST('Products Services');

サンプル結果:

+------+--------------------------------------+
| id   | content                              |
+------+--------------------------------------+
| 4    |User Values and Commercial Values of Products              |
+------+--------------------------------------+
| 1    | Customers Need Better Products and Services             |
+------+--------------------------------------+

例2: 複数列クエリの実行

複数の列からコンテンツを検索する場合は、複数列のインデックスを作成する必要はありません。 各列にフルテキストインデックスがある場合は、列に対してフルテキスト検索を実行できます。

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

または

SELECT id, content, content_alinlp
FROM `tbl_fulltext_demo`
WHERE MATCH(content) AGAINST('Services')
OR MATCH(content_alinlp) AGAINST('Services');
説明

上記のSQL文も同じ効果があります。

サンプル結果:

+------+-----------------------------+------------------------------+
| id   | content                     | content_alinlp               |
+------+-----------------------------+------------------------------+
| 1    | Customers Need Better Products and Services    | Customers Need Better Products and Services     |
+------+-----------------------------+------------------------------+

例3: ブールクエリの実行

  • AND論理演算子を使用して、すべてのキーワードに一致するコンテンツを検索します。

    SELECT * FROM `tbl_fulltext_demo` WHERE MATCH(content) AGAINST('Products AND Services');

    サンプル結果:

    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
    | id   | content                        | content_alinlp                 | content_ik                  | content_standard                     | content_ngram                        |
    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
    |    1 | Customers Need Better Products and Services         | Customers Need Better Products and Services         | Customers Need Better Products and Services       | Customers Need Better Products and Services               | Customers Need Better Products and Services               |
    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
  • OR論理演算子を使用して、いずれかのキーワードに一致するコンテンツを検索します。

    SELECT * FROM `tbl_fulltext_demo` WHERE MATCH(content) AGAINST('Products OR Services');

    サンプル結果:

    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
    | id   | content                        | content_alinlp                 | content_ik                  | content_standard                     | content_ngram                        |
    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
    |    4 | User Values and Commercial Values of Products         | User Values and Commercial Values of Products         | User Values and Commercial Values of Products       |User Values and Commercial Values of Products                | User Values and Commercial Values of Products               |
    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
    |    1 | Customers Need Better Products and Services         | Customers Need Better Products and Services         | Customers Need Better Products and Services       | Customers Need Better Products and Services               |  Customers Need Better Products and Services              |
    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
  • 論理演算子の左側のキーワードに一致し、右側のキーワードに一致しないコンテンツを検索するには、NOT論理演算子を使用します。

    SELECT * FROM `tbl_fulltext_demo` WHERE MATCH(content) AGAINST('Products NOT Services');

    サンプル結果:

    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
    | id   | content                        | content_alinlp                 | content_ik                  | content_standard                     | content_ngram                        |
    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
    |    4 | User Values and Commercial Values of Products         | User Values and Commercial Values of Products          | User Values and Commercial Values of Products      | User Values and Commercial Values of Products               | User Values and Commercial Values of Products               |
    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
  • 論理演算子の右側にあるキーワードと一致しないコンテンツを検索するには、NOT論理演算子を使用します。

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

    *:* はすべてのJSONコンテンツを指定します。 この式は、論理演算子の左側にのみ使用でき、用語パラメーターの値の先頭に配置する必要があります。

    サンプル結果:

    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
    | id   |           content              |          content_alinlp        |          content_ik         |          content_standard            |       content_ngram                  |
    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
    |    2 |        Wuhan Changjiang Bridge          |        Wuhan Changjiang Bridge          |         Wuhan Changjiang Bridge      |         Wuhan Changjiang Bridge               |            Wuhan Changjiang Bridge             |
    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
    |    4 |    User Values and Commercial Values of Products    |    User Values and Commercial Values of Products    |  User Values and Commercial Values of Products   |     User Values and Commercial Values of Products          |       User Values and Commercial Values of Products       |
    +------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+
    |    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('(Wuhan OR Hangzhou) AND (Bridge OR Xihu)');

    サンプル結果:

    +------+-----------------------+
    | id   | content_alinlp        |
    +------+-----------------------+
    |    2 | Wuhan Changjiang Bridge         |
    +------+-----------------------+

例4: クエリを実行し、結果セットをフィルター処理する

フルテキスト検索は、キーワードを近似するすべての結果を返します。 大量のデータが含まれるシナリオでは、キーワードに基づいて取得される結果セットのサイズが大きくなります。 非常に近似した結果のみが必要な場合は、AnalyticDB for MySQLが提供する結果セットのフィルタリング機能を使用できます。

次のサンプルステートメントでは、近似値が低い90% の結果を除外し、残りの10% の結果のみを返します。

SELECT id, content
FROM `tbl_fulltext_demo`
WHERE MATCH(content) AGAINST('Products Services') > 0.9;

サンプル結果:

+------+--------------------------------------+
| id   | content                              |
+------+--------------------------------------+
|    4 | User Values and Commercial Values of Products               |
+------+--------------------------------------+
|    1 | Customers Need Better Products and Services               |
+------+--------------------------------------+

例5: クエリを実行し、近似スコアで結果をソートする

AnalyticDB for MySQLを使用すると、結果の近似スコアを取得し、近似スコアで結果をソートできます。

  • 近似スコアを照会します。

    SELECT id, content, MATCH(content) AGAINST('Products Services') AS score
    FROM `tbl_fulltext_demo`
    WHERE MATCH(content) AGAINST('Products Services') > 0.9;
    説明

    WHERE MATCH(content) AGAINST (「製品サービス」) > 0.9は、低い近似を有する90% の結果がフィルタリングされ、残りの10% の結果のみが返されることを指定する。

    デフォルトでは、返される結果は近似スコアでソートされません。

    +------+--------------------------------------+----------------------+
    | id   | content                              | score                |
    +------+--------------------------------------+----------------------+
    |    4 | User Values and Commercial Values of Products               | 0.13076457381248474  |
    +------+--------------------------------------+----------------------+
    |    1 | Customers Need Better Products and Services               | 0.2615291476249695   |
    +------+--------------------------------------+----------------------+

    SELECT投影におけるMATCH(content) AGAINST('Wuhan') 関数は、WHERE句におけるMATCH(content) AGAINST('Products Services ') 関数と必ずしも同じではない。 次のサンプルステートメントは、MATCH(content) AGAINST('Wuhan') 関数の近似スコアを照会します。

    SELECT *, MATCH(content) AGAINST('Wuhan') AS score
    FROM `tbl_fulltext_demo`
    WHERE MATCH(content) AGAINST('Products Services') > 0.9
    ORDER BY score DESC;

    サンプル結果:

    +------+--------------------------------+--------------------------------+-----------------------------+-------------------------------------+--------------------------------------+-------------+
    | id   | content                        | content_alinlp                 | content_ik                  | content_standard                    | content_ngram                        |score        |
    +------+--------------------------------+--------------------------------+-----------------------------+-------------------------------------+--------------------------------------+-------------+
    |    4 | User Values and Commercial Values of Products         | User Values and Commercial Values of Products         | User Values and Commercial Values of Products       | User Values and Commercial Values of Products              | User Values and Commercial Values of Products               |0.0          |
    +------+--------------------------------+--------------------------------+-----------------------------+-------------------------------------+--------------------------------------+-------------+
    |    1 | Customers Need Better Products and Services         | Customers Need Better Products and Services         | Customers Need Better Products and Services       |Customers Need Better Products and Services               |  Customers Need Better Products and Services              |0.0          |
    +------+--------------------------------+--------------------------------+-----------------------------+-------------------------------------+--------------------------------------+-------------+
  • 近似スコアで結果を並べ替えます。

    ORDER BY句を使用して、近似スコアによって結果を降順に並べ替えます。

    SELECT id, content, MATCH(content) AGAINST('Products Services') AS score
    FROM `tbl_fulltext_demo`
    WHERE MATCH(content) AGAINST('Products Services') > 0.9
    ORDER BY score DESC;

    サンプル結果:

    +------+--------------------------------------+---------------------+
    | id   | content                              | score               |
    +------+--------------------------------------+---------------------+
    |    1 | Customers Need Better Products and Services               | 0.2615291476249695  |
    +------+--------------------------------------+---------------------+
    |    4 | User Values and Commercial Values of Products               | 0.13076457381248474 |
    +------+--------------------------------------+---------------------+

例6: 単語一致の実行

デフォルトでは、フルテキスト検索は検索前にキーワードを単語に分割します。 キーワードが二重引用符 ("") で囲まれていない場合、キーワードに含まれる単語のいずれかと一致するクエリ結果が返されます。

AliNLPアナライザは、キーワード「Products and Services」を単語「Products」、「and」、および「Services」に分割し、キーワード「Products Services」を単語「Products」および「Services」に分割する。

SELECT id, content_alinlp, MATCH(content_alinlp) AGAINST('Products Services') AS score
FROM `tbl_fulltext_demo`
WHERE MATCH(content_alinlp) AGAINST('Products Services') > 0.9
ORDER BY score DESC;

キーワード "Products Services" に含まれる単語のいずれかと一致するクエリ結果が返されます。

+------+--------------------------------------------------+---------------------+
| id   | content_alinlp                                   | score               |
+------+--------------------------------------+---------------------------------+
|    1 | Customers Need Better Products and Services      | 0.493530809879303   |
+------+--------------------------------------------------+---------------------+
|    4 | User Values and Commercial Values of Products    | 0.3704996407032013  |
+------+--------------------------------------------------+---------------------+
|    2 | Wuhan Changjiang Bridge                          | 0.17980130016803741 |
+------+--------------------------------------------------+---------------------+
|    3 | Hangzhou, Zhejiang Province                      | 0.17980130016803741 |
+------+--------------------------------------------------+---------------------+

例7: 完全一致の実行

キーワードが二重引用符 ("") で囲まれている場合、キーワードはアナライザーによってセグメント化されません。 キーワードと完全に一致するクエリ結果が返されます。

  • キーワードProducts Servicesに完全に一致するコンテンツを検索します。

    SELECT id, content_alinlp, MATCH(content_alinlp) AGAINST('"Products Services"') AS score
    FROM `tbl_fulltext_demo`
    WHERE MATCH(content_alinlp) AGAINST('"Products Services"') > 0.9
    ORDER BY score DESC;

    空の結果セットが返されます。

    Empty set
  • キーワード [製品とサービス] に完全に一致するコンテンツを検索します。

    SELECT id, content_alinlp, MATCH(content_alinlp) AGAINST('"Products and Services"') AS score
    FROM `tbl_fulltext_demo`
    WHERE MATCH(content_alinlp) AGAINST('"Products and Services"') > 0.9
    ORDER BY score DESC; 

    サンプル結果:

    +------+--------------------------------------+--------------------+
    | id   | content_alinlp                       | score              |
    +------+--------------------------------------+--------------------+
    |    1 | Customers Need Better Products and Services               | 0.6538228988647461 |
    +------+--------------------------------------+--------------------+

match() fuzzy()

MATCH() FUZZY() 関数は、ファジーマッチをサポートします。 この関数を使用して、Levenshtein編集距離に基づいてテキストを検索できます。 誤ったキーワードスペルが含まれるシナリオでは、あいまい一致により、キーワードに近いコンテンツをクエリできます。

構文

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文字列は、w文字を挿入するという単一の操作を実行することによってwindows文字列に変更されます。 この場合、windos文字列とwindows文字列の間の最大編集距離は1です。

例1: おおよその検索を実行する

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

サンプル結果:

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

例2: 編集距離1で近似検索を実行する

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

サンプル結果:

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

例3: 編集距離2で近似検索を実行する

SELECT id, content
FROM tbl_fulltext_demo
WHERE MATCH(content_standard) FUZZY('Wuhan Chang') max_edits(2);

サンプル結果:

+------+-----------------------+
| id   | content               |
+------+-----------------------+
|    2 | Wuhan Changjiang Bridge         |
+------+-----------------------+

match() フレーズ ()

MATCH() PHRASE() 関数は、フレーズ検索をサポートする。 この機能を使用して、特定の列から複数のキーワードに一致するコンテンツを検索できます。 複数のキーワードが一致する場合は、slopパラメーターを使用して、キーワードのシーケンスをさらに一致させることができます。

構文

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

パラメーター

  • table_name: 検索するテーブルの名前。

  • column_name: 検索する列の名前。

  • term1 term2: 検索キーワードのリスト。 複数のキーワードはスペースで区切ります。 キーワードのシーケンスが一致結果に影響します。

  • slop(n): 最大slop値。オプションのパラメーターです。 アナライザーを使用してテキストを単語のリストにセグメント化した後、単語の位置は昇順で0からマークされます。 PHRASEパラメーターで指定されたキーワードのリストに一致するように単語を移動できます。 デフォルト値:0 有効値: 0から6までの整数。

例: フレーズの検索

デフォルトでは、AnalyticDB for MySQLは、「杭州、浙江省」というテキストを「杭州」、「浙江省」、および「省」という単語にセグメント化するための標準アナライザーを提供します。

  • 浙江杭州キーワードのリストに一致するコンテンツを検索します。

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

    slopパラメーターのデフォルト値は0です。 浙江杭州キーワードのリストに一致するコンテンツはありません。 空の結果セットが返されます。

    Empty set
  • hangzhou Provinceキーワードのリストに一致するコンテンツを1のスロップで検索します。

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

    サンプル結果:

    +------+-----------------------------+
    | id   | content                     |
    +------+-----------------------------+
    |    3 | Hangzhou, Zhejiang Province |
    +------+-----------------------------+
  • 2のスロップで浙江省のキーワードに一致するコンテンツを検索します。

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

    サンプル結果:

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

ハイライトのサポート

関数を使用してキーワードを強調表示する

AnalyticDB for MySQLでは、fulltext_highlight('column_name') 関数を使用して、フルテキストインデックス列のキーワードを強調表示できます。

例1: MATCH() AGAINST() 関数を使用して、強調表示するキーワードを指定します。

  • 単一列のクエリを実行するときにキーワードを強調表示します。

    SELECT MATCH(content_alinlp) AGAINST('Wuhan Changjiang') AS score, fulltext_highlight(content_alinlp)
    FROM tbl_fulltext_demo
    WHERE MATCH(content_alinlp) AGAINST('Wuhan Changjiang') > 0.9
    ORDER BY score DESC LIMIT 3;

    サンプル結果:

    +--------------------+------------------------------------------------------------------------------------------------------+
    | score              | fulltext_highlight(content_alinlp)                                                                   | 
    +--------------------+------------------------------------------------------------------------------------------------------+
    | 0.4413304328918457 | <em>Wuhan</em><em> </em><em>Changjiang</em><em> </em>Bridge                                          |
    +--------------------+------------------------------------------------------------------------------------------------------+
    | 0.23973506689071655| User<em> </em>Values<em> </em>and<em> </em>Commercial<em> </em>Values<em> </em>of<em> </em>Products  |
    +--------------------+------------------------------------------------------------------------------------------------------+
    | 0.2320016771554947 | Customers<em> </em>Need<em> </em>Better<em> </em>Products<em> </em>and<em> </em>Services             |
    +--------------------+------------------------------------------------------------------------------------------------------+
  • 複数列のクエリを実行するときにキーワードを強調表示します。

    SELECT MATCH(content_alinlp) AGAINST('Wuhan Changjiang') AS score, fulltext_highlight(content_alinlp)
    FROM tbl_fulltext_demo
    WHERE MATCH(content_alinlp) AGAINST('Wuhan Changjiang') > 0.9
    AND MATCH(content_alinlp) AGAINST('Bridge') > 0.9
    ORDER BY score DESC LIMIT 3;

    サンプル結果:

    +--------------------+--------------------------------------------------+
    | score              | fulltext_highlight(content_alinlp)               |
    +--------------------+--------------------------------------------------+
    | 0.4413304328918457 | <em>Wuhan</em><em> </em><em>Changjiang</em><em> </em><em>Bridge</em>         |
    +--------------------+--------------------------------------------------+

例2: MATCH() FUZZY() 関数を使用して、強調表示するキーワードを指定します。

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

サンプル結果:

+------+-------+--------------------------------------------------+
| id   | score | fulltext_highlight(content_standard)             |
+------+-------+--------------------------------------------------+
|    2 |   0.10461166501045227 | <em>Wuhan</em> Changjiang Bridge         |
+------+-------+--------------------------------------------------+

例3: MATCH() PHRASE() 関数を使用して、強調表示するキーワードを指定します。

SELECT id, MATCH(content_ik) PHRASE('Products Services') slop(1) as score, fulltext_highlight(content_ik)
FROM tbl_fulltext_demo
WHERE MATCH(content_ik) PHRASE('Products Services') slop(1);

サンプル結果:

+------+--------------------+--------------------------------------------------------+
| id   | score              | fulltext_highlight(content_ik)                         |
+------+--------------------+--------------------------------------------------------+
|    1 | 0.16922473907470703 | Customers Need Better <em>Products</em> and <em>Services</em>               |
+------+--------------------+--------------------------------------------------------+

ヒントを使用してカスタムハイライトタグを追加する

デフォルトでは、AnalyticDB for MySQLは <em> および </em> タグを使用して、フルテキスト検索結果のキーワードを強調表示します。 ヒントを使用して、fulltext_highlight_pre_tagおよびfulltext_highlight_post_tagパラメーターを指定し、カスタムハイライトタグを追加することもできます。

例1: ヒントを使用してMATCH() AGAINST() 関数に基づいてカスタムハイライトタグを追加する

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

サンプル結果:

+--------------------+-------------------------------------------------------------------------------------------------------------------------------------+
| score              | fulltext_highlight(content_alinlp)                                                                                                  |
+--------------------+-------------------------------------------------------------------------------------------------------------------------------------+
| 0.4413304328918457 | <span>Wuhan</span><span> </span><span>Changjiang</span><span> </span>Bridge                                                         |
+--------------------+-------------------------------------------------------------------------------------------------------------------------------------+
| 0.23973506689071655| User<span> </span>Values<span> </span>and<span> </span>Commercial<span> </span>Values<span> </span>of<span> </span>Products         |
+--------------------+-------------------------------------------------------------------------------------------------------------------------------------+
| 0.2320016771554947 | Customers<span> </span>Need<span> </span>Better<span> </span>Products<span> </span>and<span> </span>Services                        |
+--------------------+-------------------------------------------------------------------------------------------------------------------------------------+

例2: ヒントを使用してMATCH() FUZZY() 関数に基づいてカスタムハイライトタグを追加する

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

サンプル結果:

+--------------------+-------------------------------------------------+
| score              | fulltext_highlight(content_alinlp)              |
+--------------------+-------------------------------------------------+
| 0.10461166501045227                | <span>Wuhan</span> Changjiang Bridge         |
+--------------------+-------------------------------------------------+

例3: ヒントを使用してMATCH() PHRASE() 関数に基づいてカスタムハイライトタグを追加する

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

サンプル結果:

+--------------------+---------------------------------------------------------------+
| score              | fulltext_highlight(content_alinlp)                            |
+--------------------+---------------------------------------------------------------+
| 0.13076457381248474 | <span>Wuhan</span> Changjiang Bridge |
+--------------------+---------------------------------------------------------------+