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

AnalyticDB for MySQL:フルテキストクエリ

最終更新日:Jun 11, 2024

このトピックでは、フルテキストインデックスを使用してデータをクエリする方法について説明します。

前提条件

フルテキストインデックスを持つテーブルが作成されます。 この例では、fulltext_testテーブルにt_idxとb_idxの2つのフルテキストインデックスがあります。

CREATE TABLE fulltext_test (
    id int,
    タイトルvarchar、
    ボディvarchar,
    FULLTEXT INDEX t_idx (タイトル) 、
    FULLTEXT INDEX b_idx (ボディ) 、
    主要なキー (id)
)
ハッシュによる分配 (id); 

注意事項

  • フルテキストクエリを実行するために定義されている列は、match() against() 操作のみをサポートします。 などの演算子=,!=,,はnullです,がnullではない、およびのようにはサポートされていません。

  • フルテキストクエリの構文には、次の特殊文字を含めることができます。+ - & |! ( ) { } [ ] ^ " ~ * ? : \ /. ただし、これらの特殊文字は \\ でエスケープする必要があります。

    たとえば、Spring /Sceneryを含むデータをクエリする場合、構文をMATCH (title) AGAINST ('Spring / Scenery' ) に設定することはできません。 正しい構文はMATCH (title) AGAINST ('Spring \\/ Scenery') です。

基本クエリ

SELECT *
FROM fulltext_test
WHERE MATCH (タイトル) 対 ('Hangzhou'); 

パラメーター:

  • MATCH (COLUMN_NAME[,...]): フルテキストインデックスが作成される列の名前。 1つ以上の列名を指定できます。 たとえば、MATCH (body) は、body列のみがクエリされることを示します。 MATCH (title, body) は、title列とbody列が照会されることを示します。

  • AGAINST ('WORDS'): 照会されるキーワード。 たとえば、AGAINST (「浙江省の杭州市」) は、浙江省の杭州が照会されることを示します。

複数列クエリ

SELECT *
FROM fulltext_test
WHERE MATCH (タイトル、本文) 対 ('Hangzhou'); 

クエリ対象の各列にフルテキストインデックスがある場合、複数の列のデータをクエリできます。 複数列のインデックスを作成する必要はありません。 次のステートメントは、前のステートメントと同じです。

SELECT *
FROM fulltext_test
WHERE MATCH (タイトル) 対 ('Hangzhou')
    またはマッチ (ボディ) 対 ('Hangzhou'); 

ブール型クエリ (論理演算子を使用)

データをクエリする場合、次の論理演算子がサポートされます。 論理演算子は大文字と小文字を区別しません。

  • AND: オペレータの両側にキーワードが存在する必要があることを示します。

  • OR: オペレータの両側のキーワードの1つが存在する必要があることを示します。

  • NOT: 演算子の右側にあるキーワードが存在できないことを示します。

次の文を使用してデータを照会できます。

SELECT *
FROM fulltext_test
WHERE MATCH (タイトル) 対 ('Hangzhou AND Zhejiang');

SELECT *
FROM fulltext_test
WHERE MATCH (タイトル) 対 ('HangzhouまたはZhejiang'); 

次のステートメントは、括弧を使用して複雑なブールクエリを作成する方法を示しています。

SELECT *
FROM fulltext_test
WHERE MATCH (タイトル) AGAINST ('(杭州または浙江) および (教育またはヘルスケア)'); 

結果セットのフィルタリング

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

次の例では、WHERE MATCH () AGAINST () > 0.9は、非常に近似した結果の上位10% のみが取得されることを示します。 結果の残りの90% はフィルタリングされます。

SELECT *
FROM fulltext_test
WHERE MATCH (タイトル) AGAINST (「浙江省の杭州市」) > 0.9; 

近似クエリまたは近似によるソート

AnalyticDB for MySQLを使用すると、結果セット内の結果の近似値を取得し、近似値で結果をソートできます。

次のステートメントを使用して近似値を取得できます。

SELECT * 、MATCH (title) AGAINST (「浙江省の杭州市」) ASスコア
FROM fulltext_test
WHERE MATCH (タイトル) AGAINST (「浙江省の杭州市」) > 0.9; 

デフォルトでは、返された結果セットの結果は近似値でソートされません。 結果を降順に近似値でソートする場合は、order by DESC句を追加する必要があります。

次のステートメントを使用して、結果セットの結果を降順に近似でソートできます。

SELECT * 、MATCH (title) AGAINST (「浙江省の杭州市」) ASスコア
FROM fulltext_test
WHERE MATCH (title) AGAINST (「浙江省の杭州市」) > 0.9
注文によってスコアDESC; 

前のステートメントのMATCH (title) AGAINST (「浙江省の杭州市」) は、後続のクエリのステートメントと同じである必要はありません。 たとえば、次のステートメントを実行して、MATCH (body) AGAINST ('China') ステートメントから取得した結果の近似値をクエリできます。

SELECT * 、MATCH (body) AGAINST ('China') ASスコア
FROM fulltext_test
WHERE MATCH (title) AGAINST (「浙江省の杭州市」) > 0.9
注文によってスコアDESC; 

フレーズクエリまたは完全一致

デフォルトでは、AnalyticDB for MySQL V3.0のフルテキストインデックス機能は、フレーズを単語に分割し、単語を個別にクエリします。 たとえば、中華人民共和国というフレーズは、人民、共和国、中国という言葉に分けられます。 次に、単語は別々に照会されます。 いくつかの特別なシナリオでは、正確な一致が必要です。 たとえば、中華人民共和国のフレーズに完全に一致する結果のみを返す必要があり、単語に一致する結果は必要ありません。 この場合、フレーズクエリの構文を使用できます。

重要
  • 基本クエリ: フレーズを単語に分割した後、データがクエリされます。 キーワードは二重引用符 (") で囲まれていません。

  • フレーズクエリ: 完全一致がサポートされています。 フレーズは単語に分割されません。 キーワードは二重引用符 (") で囲まれています。

基本的なクエリ文:

SELECT * 、MATCH (title) AGAINST (「人民共和国」) ASスコア
FROM fulltext_test
WHERE MATCH (title) AGAINST (「人民共和国」) > 0.9
注文によってスコアDESC; 

フレーズクエリ文:

SELECT * 、MATCH (title) AGAINST ('"中華人民共和国"') ASスコア
FROM fulltext_test
WHERE MATCH (title) AGAINST ('"中華人民共和国"') > 0.9
注文によってスコアDESC; 

ハイライトのサポート

関数を使用してデータを強調表示

AnalyticDB for MySQL V3.0のフルテキストインデックス機能を使用すると、fulltext_highlight (列) 関数を使用してクエリ結果を強調表示できます。 例:

SELECT MATCH (title) AGAINST (「浙江省の杭州市」) AS score, fulltext_highlight(title)
FROM fulltext_test
WHERE MATCH (title) AGAINST (「浙江省の杭州市」) > 0.9
ORDER BYスコアDESC
LIMIT 5; 

検索結果:

score | fulltext_highlight(title) |
+ -------------------- + ------------------------------------------------------------------------------------ +
| 15.57516860961914 | <em> 浙江省 </em> <em> 杭州市 </em> 中央サイバースペース問題委員会の事務所WeChat公式アカウントEr Geng Diner対面会議の担当者を召喚 |
| 11.763599395751953 | Huayu Fangyuanプロジェクトが <em> 浙江省 </em> 蘭西 <em> 市 </em> で正式に署名 |
| 11.269683837890625 | <em> 浙江省 </em> のトップ5大学を知っていますか?                                                 |
| 11.153276443481445 | <em> 浙江省 </em> にある浙江大学のみが全国的な「ダブルファーストクラスイニシアチブ」に選ばれました。 <em> 浙江省 </em> の大学教育は貧弱だと言えますか?                       |
| 10.928305625915527 | <em> 杭州市 </em> でカップルに最も適した場所 | 

ヒントを使用してハイライト動作をカスタマイズ

例:

/* fulltext_highlight_pre_tag=<span>,fulltext_highlight_post_tag=</span>* /
SELECT MATCH (title) AGAINST (「浙江省の杭州市」) AS score, fulltext_highlight(title)
FROM fulltext_test
WHERE MATCH (title) AGAINST (「浙江省の杭州市」) > 0.9
ORDER BYスコアDESC
LIMIT 5; 

作成したタグに等号 (=) またはコンマ (,) が含まれている場合は、次の例に示すように、ブラケット [] を使用してタグ値を囲みます。

/* fulltext_highlight_pre_tag=[<h3 style="color:blue">],fulltext_highlight_post_tag=</h3>* /
SELECT MATCH (title) AGAINST (「浙江省の杭州市」) AS score, fulltext_highlight(title)
FROM fulltext_test
WHERE MATCH (title) AGAINST (「浙江省の杭州市」) > 0.9
ORDER BYスコアDESC
LIMIT 5; 

検索結果:

+ -------------------- + -------------------------------------------------------------------------------------------------------------------------- +
| score | fulltext_highlight(title) |
+ -------------------- + -------------------------------------------------------------------------------------------------------------------------- +
| 15.867133140563965 | 中央サイバースペース委員会の事務所 <h3 style="color:blue"> 浙江省 </h3> <h3 style="color:blue"> 杭州市 </h3> 召喚担当者WeChat公式アカウントEr Geng Diner for a Face-to-face Meeting |
| 12.205625534057617 | Huayu Fangyuanプロジェクト <h3 style="color:blue"> 浙江省 </h3> のLanxi <h3 style="color:blue">City</h3> で正式に署名 |
| 11.646674156188965 | <h3 style="color:blue"> 浙江省 </h3> の浙江大学のみが全国的な「ダブルファーストクラスイニシアチブ」に選ばれました。 <h3 style="color:blue"> 浙江省 </h3> での大学教育は貧弱だと言えますか?  |
| 11.338353157043457 | <h3 style="color:blue"> 浙江省 </h3> でトップ5の大学を知っていますか?                                                        |
| 11.2699556350708 | <h3 style="color:blue"> 浙江省 </h3> の経済センターが寧波にある理由 <h3 style="color:blue"> 杭州 </h3> のGDPが153.85億米ドルに達し、寧波のGDPは130.77億米ドルですか?  |
+--------------------+--------------------------------------------------------------------------------------------------------------------------+

列に複数のフルテキストインデックスがある場合のデータの強調表示

列に複数のフルテキストインデックスがある場合、次のステートメントを使用してデータをクエリできます。

SELECT MATCH (title) AGAINST (「浙江省の杭州市」) AS score, fulltext_highlight(title)
FROM fulltext_test
WHERE MATCH (title) AGAINST (「浙江省の杭州市」) > 0.9
    AND MATCH (タイトル) AGAINST (「中国」) > 0.9
ORDER BYスコアDESC
LIMIT 5; 

浙江省の杭州市と中国の両方が強調されています。 次の応答が返されます。

+ -------------------- + ---------------------------------------------- +
| score | fulltext_highlight(title) |
+ -------------------- + ---------------------------------------------- +
| 4.041414260864258 | <em> 杭州 </em> で <em> 中国 </em> のベストは何ですか?        |
| 3.8747754096984863 | <em> 中国 </em> の <em> 杭州 </em> の観光地区 |
| 3.7213351726531982 | 旅行 <em> 中国 </em> 、<em> 杭州 </em> |
| 3.7213351726531982 | <em> 中国 </em> 、<em> 杭州 </em> のフードマップ |
| 3.641066789627075 | <em> 中国 </em> のどの <em> 州 </em> がXiangxiにいますか?        |
+--------------------+----------------------------------------------+