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

Tablestore:ワイルドカードクエリを使用するときに「[WILDCARD_QUERY] クエリのフィールド値の長さが 32 を超えています」というエラーが発生した場合はどうすればよいですか?

最終更新日:Jul 03, 2025

「[WILDCARD_QUERY] クエリのフィールド値の長さが 32 を超えています」という例外がワイルドカードクエリの実行中に発生した場合は、クエリ文字列を短くするか、マッチフレーズクエリを使用できます。

問題の説明

ワイルドカードクエリを使用してデータをクエリすると、次の例外が発生します。

length of field value is longer than 32 for the [WILDCARD_QUERY] query

原因

ワイルドカード文字を含む文字列が、32 文字の制限を超えています。

解決策

クエリ文字列を短くする

クエリ文字列の長さが 32 文字を超えないように短くします。

トークン化ベースのワイルドカードクエリ

次元インデックスは、トークン化ベースのワイルドカードクエリをサポートしており、より効率的なあいまいクエリを実装できます。 トークン化ベースのワイルドカードクエリを使用する場合、クエリ文字列の長さに制限はありません。 ただし、元のコンテンツは最大 1,024 文字に制限されています。 この制限を超えるコンテンツは自動的に切り捨てられ、最初の 1,024 文字のみが保持されます。

  1. 次元インデックススキーマを動的に変更します。

    ビジネスへの影響の評価に基づいて、ターゲット列を変更するか、仮想列を追加し、タイプを Text に設定し、トークン化メソッドをあいまいトークン化に設定します。 詳細については、「次元インデックスのスキーマを動的に変更する」および「仮想列」をご参照ください。

  2. マッチフレーズクエリ (MatchPhraseQuery) を使用します。

    詳細については、「トークン化ベースのワイルドカードクエリ」をご参照ください。

SQL ワイルドカードクエリのシナリオ

SQL 文を使用してデータをクエリする場合、データテーブルに SQL 文に含まれるすべてのデータ列を含む次元インデックスがある場合、SQL エンジンはデータクエリにこの次元インデックスを自動的に選択します。 この場合、SQL ワイルドカードクエリ ( LIKE 演算子とワイルドカード文字 % の組み合わせなど) を実行する場合、クエリ文字列の長さにも制限があります (最大 32 文字)。

次の操作を実行することで、この問題を解決できます。

  1. 次元インデックススキーマを動的に変更します。

    ビジネスへの影響の評価に基づいて、ターゲット列を変更するか、仮想列を追加し、タイプを Text に設定し、トークン化メソッドをあいまいトークン化に設定します。 詳細については、「次元インデックスのスキーマを動的に変更する」および「仮想列」をご参照ください。

  2. 次元インデックスのマッピングテーブルを作成する

    次の例では、データテーブル example_table の次元インデックス example_table_indexexample_table__example_table_index という名前のマッピングテーブルを作成します。

    CREATE TABLE `example_table__example_table_index`(
        `pk` MEDIUMTEXT,
        `attr` MEDIUMTEXT,
        `attr_virtual` MEDIUMTEXT #仮想列
    )
    ENGINE='searchindex',
    ENGINE_ATTRIBUTE='{"index_name":"example_table_index","table_name":"example_table"}';
  3. SQL 文で マッチフレーズクエリ (TEXT_MATCH_PHRASE) を使用します。

    次の例では、仮想列 attr_virtual の値が文字列「tablestore is super cool!」と一致する次元インデックスマッピングテーブル example_table__example_table_index のデータをクエリします。

    select * from example_table__example_table_index where TEXT_MATCH_PHRASE(attr_virtual, "tablestore is super cool!");