「[WILDCARD_QUERY] クエリのフィールド値の長さが 32 を超えています」という例外がワイルドカードクエリの実行中に発生した場合は、クエリ文字列を短くするか、マッチフレーズクエリを使用できます。
問題の説明
ワイルドカードクエリを使用してデータをクエリすると、次の例外が発生します。
length of field value is longer than 32 for the [WILDCARD_QUERY] query
原因
ワイルドカード文字を含む文字列が、32 文字の制限を超えています。
解決策
クエリ文字列を短くする
クエリ文字列の長さが 32 文字を超えないように短くします。
トークン化ベースのワイルドカードクエリ
次元インデックスは、トークン化ベースのワイルドカードクエリをサポートしており、より効率的なあいまいクエリを実装できます。 トークン化ベースのワイルドカードクエリを使用する場合、クエリ文字列の長さに制限はありません。 ただし、元のコンテンツは最大 1,024 文字に制限されています。 この制限を超えるコンテンツは自動的に切り捨てられ、最初の 1,024 文字のみが保持されます。
次元インデックススキーマを動的に変更します。
ビジネスへの影響の評価に基づいて、ターゲット列を変更するか、仮想列を追加し、タイプを Text に設定し、トークン化メソッドをあいまいトークン化に設定します。 詳細については、「次元インデックスのスキーマを動的に変更する」および「仮想列」をご参照ください。
マッチフレーズクエリ (MatchPhraseQuery) を使用します。
詳細については、「トークン化ベースのワイルドカードクエリ」をご参照ください。
SQL ワイルドカードクエリのシナリオ
SQL 文を使用してデータをクエリする場合、データテーブルに SQL 文に含まれるすべてのデータ列を含む次元インデックスがある場合、SQL エンジンはデータクエリにこの次元インデックスを自動的に選択します。 この場合、SQL ワイルドカードクエリ ( LIKE
演算子とワイルドカード文字 %
の組み合わせなど) を実行する場合、クエリ文字列の長さにも制限があります (最大 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 #仮想列
)
ENGINE='searchindex',
ENGINE_ATTRIBUTE='{"index_name":"example_table_index","table_name":"example_table"}';
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!");