このトピックでは、フルテキストインデックス関数 MATCH() AGAINST()、MATCH() FUZZY()、および MATCH() PHRASE() を使用して全文検索を実行し、全文検索キーワードをハイライトする方法について説明します。
前提条件
フルテキストインデックスが作成されていること。詳細については、「フルテキストインデックスの作成」をご参照ください。
サンプルデータ
この例では、サンプルデータを提供するために `tbl_fulltext_demo` という名前のテーブルが作成されます。各フルテキストインデックスは、異なるアナライザを使用します。次の SQL 文を使用して `tbl_fulltext_demo` テーブルを作成し、データを挿入します。
/* RC_DDL_ENGINE_REWRITE_XUANWUV2=false */
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,-- AliNLP アナライザを使用
FULLTEXT INDEX fidx_ik(`content_ik`) WITH ANALYZER ik,-- IK アナライzaを使用
FULLTEXT INDEX fidx_standard(`content_standard`) WITH ANALYZER standard,-- 標準アナライザを使用
FULLTEXT INDEX fidx_ngram(`content_ngram`) WITH ANALYZER ngram,-- 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, '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')。フルテキストインデックス関数は、
=、!=、BETWEEN、IS NULL、IS NOT NULL、LIKEなどの演算子をサポートしていません。
Match() against()
MATCH() AGAINST() 関数は、単語一致と完全一致をサポートします。この関数を使用して、1 つ以上の列からキーワードに一致するコンテンツを検索できます。
構文
SELECT * FROM `table_name` WHERE match (column_name[ , ... ]) against('term')パラメーター
table_name: 検索するテーブルの名前。
column_name: 検索する列の名前。複数の列はカンマ (,) で区切ります。
term: 検索キーワード。キーワード検索では、次の論理演算子がサポートされています:
AND: すべてのキーワードに一致するコンテンツを検索します。
OR: いずれかのキーワードに一致するコンテンツを検索します。
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 コンテンツを指定します。この式は論理演算子の左側でのみ使用でき、term パラメーターの値の先頭に配置する必要があります。結果の例:
+------+--------------------------------+--------------------------------+-----------------------------+--------------------------------------+--------------------------------------+ | 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('Products Services') > 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;重要WHERE MATCH(content) AGAINST('Products Services') > 0.9は、近似度の低い結果の 90% を除外し、残りの 10% の結果のみを返すことを指定します。結果の例:
+------+--------------------------------------+---------------------+ | 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;WHERE MATCH(content) AGAINST('Products Services') > 0.9 は、近似度の低い結果の 90% を除外し、残りの 10% の結果のみを返すことを指定します。
キーワード "Products Services" に含まれるいずれかの単語に一致するクエリ結果が返されます:
+------+--------------------------------------+---------------------+
| id | content_alinlp | score |
+------+--------------------------------------+---------------------+
| 1 | Customers Need Better Products and Services | 0.2615291476249695 |
+------+--------------------------------------+---------------------+
| 4 | User Values and Commercial Values of Products | 0.13076457381248474 |
+------+--------------------------------------+---------------------+例 7: 完全一致の実行
キーワードが二重引用符 ("") で囲まれている場合、キーワードはアナライザによってセグメント化されません。キーワードに完全に一致するクエリ結果が返されます。
キーワード Products Services に完全に一致するコンテンツを検索します。
SELECT id, content_alinlp, MATCH (content_alinlp) AGAINST ('"product service"') AS score FROM `tbl_fulltext_demo` WHERE MATCH (content_alinlp) AGAINST ('"product service"') > 0.9 ORDER BY score DESC;空の結果セットが返されます。
Empty setキーワード Products and Services に完全に一致するコンテンツを検索します。
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;重要WHERE MATCH(content) AGAINST('Products Services') > 0.9は、近似度の低い結果の 90% を除外し、残りの 10% の結果のみを返すことを指定します。結果の例:
+------+--------------------------------------+--------------------+ | id | content_alinlp | score | +------+--------------------------------------+--------------------+ | 1 | Customers Need Better Products and Services | 0.3922937512397766 | +------+--------------------------------------+--------------------+
Match() fuzzy()
MATCH() FUZZY() 関数は、あいまい一致をサポートします。この関数を使用して、レーベンシュタイン編集距離に基づいてテキストを検索できます。キーワードのスペルが間違っているシナリオでは、あいまい一致によりキーワードに近似するコンテンツをクエリできます。
構文
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 文字を挿入する 1 回の操作で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() 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 までの整数。たとえば、標準アナライザを使用してテキスト "Merchandise and Services" をセグメント化すると、結果は "Merchandise"、"and"、"Services" になります。
テキスト
Merchandise
Brand
And
Service
Service
位置
0
1
2
3
4
PHRASE('Merchandise and'): スロップ距離は 1 です。これは、"Merchandise" が 1 ステップ右に移動するか、"and" が 1 ステップ左に移動することを意味します。
PHRASE('Merchandise Services'): スロップ距離は 2 です。これは、"Merchandise" が 2 ステップ右に移動するか、"Services" が 2 ステップ左に移動することを意味します。
例: フレーズの検索
デフォルトでは、AnalyticDB for MySQL は標準アナライザを提供し、テキスト "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 | +------+-----------------------------+
例 2: 中国語のフレーズ検索
MATCH() PHRASE() の中国語フレーズ一致シナリオでは、組み込みの AliNLP アナライザと Ngram アナライザを使用すると、中国語一致クエリデータが失敗する可能性があります。したがって、Standard Analyzer と IK Analyzer を使用することをお勧めします。
スロップが 1 のキーワードのリスト Products Services に一致するコンテンツを検索します。
SELECT id, content FROM tbl_fulltext_demo WHERE MATCH(content_ik) PHRASE('Products Services') slop(1);結果の例:
+------+--------------------------------------+ | id | content | +------+--------------------------------------+ | 1 | Customers Need Better Products and Services | +------+--------------------------------------+スロップが 2 のキーワードのリスト Products Services に一致するコンテンツを検索します。
SELECT id, content FROM tbl_fulltext_demo WHERE MATCH(content_standard) PHRASE('Products Services') slop(2);結果の例:
+------+--------------------------------------+ | id | content | +------+--------------------------------------+ | 1 | Customers Need Better Products and Services | +------+--------------------------------------+
ハイライトのサポート
関数を使用したキーワードのハイライト
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;重要WHERE MATCH(content_alinlp) AGAINST('Wuhan Changjiang') > 0.9は、近似度の低い結果の 90% を除外し、残りの 10% の結果のみを返すことを指定します。結果の例:
+--------------------+-----------------------------------------+ | score | fulltext_highlight(content_alinlp) | +--------------------+-----------------------------------------+ | 0.4413304328918457 | Bridge | +--------------------+-----------------------------------------+複数列クエリを実行するときにキーワードをハイライトします。
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;重要WHERE MATCH (content_alinlp) AGAINST ('Wuhan Changjiang') > 0.9は、近似度の低い結果の 90% を除外し、近似度で上位 10% にランク付けされた結果のみを返すことを示します。結果の例:
+--------------------+--------------------------------------------------+ | score | fulltext_highlight(content_alinlp) | +--------------------+--------------------------------------------------+ | 0.2615291476249695 | | +--------------------+--------------------------------------------------+
例 2: MATCH() FUZZY() 関数を使用してキーワードをハイライトする
SELECT id, MATCH(content_standard) FUZZY('Wuhan Chang') as score, fulltext_highlight(content_standard)
FROM tbl_fulltext_demo
WHERE MATCH(content_standard) FUZZY('Wuhan Chang');結果の例:
+------+-------+--------------------------------------------------+
| id | score | fulltext_highlight(content_standard) |
+------+-------+--------------------------------------------------+
| 2 | 0.0 | jiang 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 and |
+------+--------------------+--------------------------------------------------------+ヒントワードを使用したカスタムハイライトタグの追加
AnalyticDB for MySQL の全文検索のハイライトでは、デフォルトで <em> タグと </em> タグが使用されます。ヒントワードを使用して fulltext_highlight_pre_tag と fulltext_highlight_post_tag の値を設定し、カスタムハイライトタグを定義することもできます。
例 1: ヒントワードを使用して MATCH() AGAINST() 関数に基づいてカスタムハイライトタグを追加する
/*+ fulltext_highlight_pre_tag=*/
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;WHERE MATCH (content_alinlp) AGAINST ('Wuhan Changjiang') > 0.9 は、近似度の低い結果の 90% を除外し、近似度の高い上位 10% の結果のみを返すことを示します。
結果の例:
+--------------------+-------------------------------------------------+
| score | fulltext_highlight(content_alinlp) |
+--------------------+-------------------------------------------------+
| 0.2615291476249695 | city Bridge |
+--------------------+-------------------------------------------------+例 2: ヒントワードを使用して MATCH() FUZZY() 関数に基づいてカスタムハイライトタグを追加する
/*+ fulltext_highlight_pre_tag=*/
SELECT MATCH (content_alinlp) FUZZY ('Wuhan Changjiang') AS score, fulltext_highlight(content_alinlp)
FROM tbl_fulltext_demo
WHERE MATCH (content_alinlp) FUZZY ('Wuhan Changjiang') > 0.9
ORDER BY score DESC LIMIT 3;WHERE MATCH (content_alinlp) FUZZY ('Wuhan Changjiang') > 0.9 は、近似度の低い結果の 90% を除外し、近似度が最も高い上位 10% の結果のみを返すことを示します。
結果の例:
+--------------------+-------------------------------------------------+
| score | fulltext_highlight(content_alinlp) |
+--------------------+-------------------------------------------------+
| 0.0 | Bridge |
+--------------------+-------------------------------------------------+例 3: ヒントワードを使用して MATCH() PHRASE() 関数に基づいてカスタムハイライトタグを追加する
/*+ fulltext_highlight_pre_tag=*/
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;WHERE MATCH (content_alinlp) PHRASE ('Wuhan') > 0.9 は、近似度の低い結果の 90% を除外し、近似度が最も高い上位 10% の結果のみを返すことを示します。
結果の例:
+--------------------+---------------------------------------------------------------+
| score | fulltext_highlight(content_alinlp) |
+--------------------+---------------------------------------------------------------+
| 0.13076457381248474 | Customers Need Better |
+--------------------+---------------------------------------------------------------+