このトピックでは、Search操作の呼び出しでデータが見つからない問題、考えられる原因、および問題の解決策について説明します。
問題の説明
Search操作を呼び出すと、データが見つかりません。
原因
- テーブル内のデータが検索インデックスに適切に同期されていません。
- テーブル内のデータは、検索インデックスに非同期的に同期されます。インクリメンタルデータ同期の遅延は通常10秒以内であり、フルデータ同期の遅延はテーブル内のデータ量に正比例します。
- 検索インデックスの列名は大文字と小文字が区別され、テーブルの列名と一致しない場合があります。たとえば、テーブルの列名がColumnNameであるとします。検索インデックスの列名がcolumnnameの場合、columnnameはテーブルの列と一致しません。
- 検索インデックスの列のデータ型が、テーブルのデータ型と一致しません。たとえば、テーブルの列はINTEGERデータ型ですが、検索インデックスの対応する列はKEYWORDデータ型です。説明 Tablestoreのワイドカラムモデルは、スキーマフリーのストレージ構造です。同じ属性列に異なるデータ型の値を含めることができ、一部の行が同期されない場合があります。
- 検索インデックスの列のデータ型が、テーブルのデータ形式と一致しません。たとえば、テーブルの列はSTRINGデータ型で、値は-91,100ですが、検索インデックスの対応する列はGEOPOINTデータ型です。説明 検索インデックスの地理的位置データ型は、「緯度、経度」形式です。緯度は-90~+90の範囲、経度は-180~+180の範囲でなければならず、緯度と経度は順番に指定する必要があります。
- クエリメソッドが正しくありません。
- 一致クエリは、検索インデックスのKEYWORDデータ型のフィールドのデータをクエリするために使用されます。たとえば、検索インデックスの対応する列がKEYWORDデータ型であるのに、クエリ条件MatchQuery("ab")が検索インデックスのデータ"abc"をクエリするように設定されているとします。KEYWORDデータ型はトークン化できないため、クエリは失敗します。
- クエリ条件で指定されたパラメータが正しく構成されていません。たとえば、検索インデックスの対応する列がKEYWORDデータ型であるのに、クエリ条件TermQuery("ab")が検索インデックスのデータ"abc"をクエリするように設定されているとします。
- RangeQueryを使用して検索インデックスのKEYWORDデータ型のフィールドのデータをクエリする場合、設定が正しくありません。たとえば、テーブルのデータが20で、クエリ条件RangeQuery(>10)が検索インデックスで値が10より大きいデータをクエリするように設定されており、検索インデックスの対応する列がKEYWORDデータ型であるとします。説明 RangeQueryでは、KEYWORDデータ型の値はアルファベット順で比較され、LONGおよびDOUBLEデータ型の値は値のサイズに基づいて比較されます。
- 正しくないトークナイザーが使用されています。たとえば、検索インデックスの対応する列がTEXTデータ型で、トークナイザーの型が単一単語トークン化に設定されているのに、クエリ条件MatchQuery("abcd")が検索インデックスのデータ"abcdefg"をクエリするように設定されているとします。
解決策
- 検索インデックスを作成するときは、テーブルの列名とデータ型に正しく対応する列名とデータ型を指定し、検索インデックスのデータ型と一致するテーブルに書き込まれるデータのデータ形式を指定します。詳細については、基本データ型のマッピングまたは配列およびネストされたデータ型を参照してください。
- テーブルから検索インデックスにデータを同期します。
- 検索インデックスを使用する場合は、適切なクエリメソッドを選択し、正しいクエリ条件を指定します。詳細については、Tablestore SDKの使用を参照してください。
- 正しいトークナイザーが使用されていることを確認します。詳細については、トークン化を参照してください。