ワイルドカード検索を使用してあいまい検索を実行できます。ワイルドカード検索は、データベースの LIKE 演算子に似ており、テキスト内の単語またはフレーズを含むデータを検索するために使用できます。
背景情報
ワイルドカード検索を実行する場合、検索でアスタリスク (*) および疑問符 (?) のワイルドカード文字を使用してデータを検索できます。アスタリスク (*) は、検索語の前、後、または検索語にある任意の長さの文字列と一致します。疑問符 (?) は、特定の位置にある 1 文字と一致します。文字列は、アスタリスク (*) または疑問符 (?) で始めることができます。たとえば、"table*e" 文字列を検索すると、"tablestore" が一致します。
*word* (SQL の WHERE field_a LIKE '%word%' と同等) を使用してデータを検索する場合は、トークン化ベースのワイルドカード検索を使用できます。詳細については、「トークン化ベースのワイルドカード検索」をご参照ください。データ量が増加しても、クエリのパフォーマンスは低下しません。
NOT LIKE 演算子を使用する場合は、ブール値クエリの mustNotQueries パラメーターと共にワイルドカード検索を使用する必要があります。詳細については、「ブール値クエリ」をご参照ください。
前提条件
Tablestore クライアントが初期化されていること。詳細については、「Tablestore クライアントを初期化する」をご参照ください。
データテーブルが作成されていること。データがテーブルに書き込まれていること。詳細については、「データテーブルを作成する」および「データを書き込む」をご参照ください。
データテーブルの検索インデックスが作成されていること。詳細については、「検索インデックスを作成する」をご参照ください。
パラメーター
パラメーター | 説明 |
fieldName | 検索するフィールドの名前。 |
value | ワイルドカード文字を含む文字列。文字列の長さは 32 文字を超えることはできません。 |
query | クエリの種類。このパラメーターを WildcardQuery に設定します。 |
getTotalCount | クエリ条件を満たす行の総数を返すかどうかを指定します。このパラメーターのデフォルト値は false で、クエリ条件を満たす行の総数は返されません。 このパラメーターを true に設定すると、クエリのパフォーマンスが低下します。 |
weight | BM25 ベースのキーワード関連性スコアを計算するために、検索するフィールドに割り当てる重み。このパラメーターは、全文検索シナリオで使用されます。検索するフィールドに高い重みを指定すると、そのフィールドの BM25 ベースのキーワード関連性スコアが高くなります。このパラメーターの値は、正の浮動小数点数です。 このパラメーターは、返される行の数には影響しませんが、クエリ結果の BM25 ベースのキーワード関連性スコアに影響します。 |
tableName | データテーブルの名前。 |
indexName | 検索インデックスの名前。 |
columnsToGet | クエリ条件を満たす各行のすべての列を返すかどうかを指定します。このパラメーターには、returnAll フィールドと columns フィールドを設定できます。 returnAll フィールドのデフォルト値は false で、すべての列が返されるわけではないことを指定します。この場合、columns フィールドを使用して、返す列を指定できます。返す列を指定しない場合は、プライマリキー列のみが返されます。 returnAll フィールドを true に設定すると、すべての列が返されます。 |
例
次のサンプルコードは、Col_Keyword 列の値が "hang*u" パターンと一致する行を検索する方法の例を示しています。
/**
* テーブルで Col_Keyword 列の値が "hang*u" パターンと一致する行を検索します。
* @param client
*/
private static void wildcardQuery(SyncClient client) {
SearchQuery searchQuery = new SearchQuery();
WildcardQuery wildcardQuery = new WildcardQuery(); // WildcardQuery を使用します。
wildcardQuery.setFieldName("Col_Keyword");
wildcardQuery.setValue("hang*u"); // wildcardQuery に 1 つ以上のワイルドカード文字を含む文字列を指定します。
searchQuery.setQuery(wildcardQuery);
//searchQuery.setGetTotalCount(true); // 一致する行の総数を返すように指定します。
SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
// columnsToGet パラメーターを設定して、返す列を指定するか、すべての列を返すように指定できます。このパラメーターを設定しない場合は、プライマリキー列のみが返されます。
//SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
//columnsToGet.setReturnAll(true); // すべての列を返すように指定します。
//columnsToGet.setColumns(Arrays.asList("ColName1","ColName2")); // 返す列を指定します。
//searchRequest.setColumnsToGet(columnsToGet);
SearchResponse resp = client.search(searchRequest);
//System.out.println("TotalCount: " + resp.getTotalCount()); // 返された行の数ではなく、一致する行の総数を表示します。
System.out.println("Row: " + resp.getRows());
}FAQ
参照
検索インデックスを使用してデータを検索する場合、次のクエリメソッドを使用できます。term クエリ、複数値完全一致検索、完全一致検索、一致検索、フレーズ一致検索、プレフィックスクエリ、範囲クエリ、ワイルドカード検索、ジオクエリ、KNN ベクタークエリ、ブール値クエリ、ネストされたクエリ、exists クエリ。検索インデックスを作成した後、検索インデックスで提供されるクエリメソッドを使用して、ビジネス要件に基づいて複数のディメンションからデータを検索できます。
ソート機能とページング機能を使用して、クエリ条件を満たす行をソートまたはページングできます。詳細については、「ソートとページングを実行する」をご参照ください。
折りたたみ (個別) 機能を使用して、特定の列に基づいて結果セットを折りたたむことができます。このようにして、指定されたタイプのデータはクエリ結果に 1 回だけ表示されます。詳細については、「折りたたみ (個別)」をご参照ください。
テーブル内のデータを分析する場合は、Search 操作を呼び出して集約機能を使用するか、SQL クエリ機能を使用できます。たとえば、最大値と最小値、値の合計、行数をクエリできます。詳細については、「集約」および「SQL クエリ」をご参照ください。
行をソートする必要なく、クエリ条件を満たすすべての行を取得する場合は、ParallelScan 操作と ComputeSplits 操作を呼び出して並列スキャン機能を使用できます。詳細については、「並列スキャン」をご参照ください。