ワイルドカードクエリの実行中に「length of field value is longer than 32 for the [WILDCARD_QUERY] query」例外が発生した場合は、クエリ文字列を短縮するか、match phrase クエリを使用してください。
問題の説明
ワイルドカードクエリを使用してデータをクエリする際に、次の例外が発生します。
length of field value is longer than 32 for the [WILDCARD_QUERY] query
原因
ワイルドカード文字を含む文字列が 32 文字の制限を超えています。
ソリューション
クエリ文字列の短縮
クエリ文字列を短縮して、長さが 32 文字を超えないようにします。
トークン化ベースのワイルドカードクエリ
多次元インデックスは、トークン化ベースのワイルドカードクエリをサポートしており、より効率的なあいまいクエリを実現できます。トークン化ベースのワイルドカードクエリを使用する場合、クエリ文字列の長さに制限はありません。ただし、元のコンテンツは最大 1,024 文字に制限されます。この制限を超えるコンテンツは自動的に切り捨てられ、最初の 1,024 文字のみが保持されます。
-
多次元インデックススキーマを動的に変更します。
ビジネスへの影響を評価した上で、対象カラムを変更するか仮想カラムを追加し、タイプを Text に、トークン化方法をあいまいトークン化に設定します。詳細については、「多次元インデックススキーマの動的変更」および「仮想カラム」をご参照ください。
-
match phrase クエリ (MatchPhraseQuery) を使用します。
詳細については、「トークンベースのワイルドカードクエリ」をご参照ください。
SQL ワイルドカードクエリのシナリオ
SQL 文を使用してデータをクエリする際、データテーブルに、その SQL 文に関係するすべてのデータ列を含む検索インデックスがある場合、SQL エンジンはデータクエリにこの検索インデックスを自動的に選択します。この場合、LIKE 演算子とワイルドカード文字 % を組み合わせた SQL ワイルドカードクエリなどを実行する際にも、クエリ文字列の長さが制限されます (最大 32 文字)。
この問題は、次の操作によって解決できます。
-
多次元インデックススキーマを動的に変更します。
ビジネスへの影響を評価した上で、対象カラムを変更するか仮想カラムを追加し、タイプを Text に、トークン化方法をあいまいトークン化に設定します。詳細については、「多次元インデックススキーマの動的変更」および「仮想カラム」をご参照ください。
-
多次元インデックスのマッピングテーブルを作成します。
次の例では、データテーブル example_table の検索インデックス example_table_index 用に、example_table__example_table_index という名前のマッピングテーブルを作成します。
CREATE TABLE `example_table__example_table_index`(
`pk` MEDIUMTEXT,
`attr` MEDIUMTEXT,
`attr_virtual` MEDIUMTEXT #virtual column
)
ENGINE='searchindex',
ENGINE_ATTRIBUTE='{"index_name":"example_table_index","table_name":"example_table"}';
-
SQL ステートメントで match phrase クエリ (TEXT_MATCH_PHRASE) を使用します。
次の例では、多次元インデックスマッピングテーブル example_table__example_table_index 内で、仮想カラム attr_virtual の値が文字列「tablestore is super cool!」と一致するデータをクエリします。
select * from example_table__example_table_index where TEXT_MATCH_PHRASE(attr_virtual, "tablestore is super cool!");