ブールクエリは、複数のサブクエリを組み合わせてデータテーブルから行を取得します。Tablestore は、組み合わせた条件に一致する行のみを返します。サブクエリには任意のタイプ(別のブールクエリを含む)を使用できます。
前提条件
-
OTSClient インスタンスが初期化されています。詳細については、「OTSClient インスタンスの初期化」をご参照ください。
-
データテーブルが作成されます。データがテーブルに書き込まれます。詳細については、「データテーブルを作成する」および「データを書き込む」をご参照ください。
-
データテーブルに対して多次元インデックスが作成されています。詳細については、「多次元インデックスの作成」をご参照ください。
パラメーター
|
パラメーター |
説明 |
|
table_name |
データテーブルの名前です。 |
|
index_name |
検索インデックスの名前。 |
|
must_queries |
AND 演算子です。Tablestore は、すべてのサブクエリ条件に一致する行のみを返します。 |
|
must_not_queries |
NOT 演算子です。Tablestore は、どのサブクエリ条件にも一致しない行のみを返します。複数のサブクエリが指定されている場合、このパラメーターは NOT(A OR B) と同等であり、いずれか 1 つのサブクエリに一致する行は除外されます。 |
|
filter_queries |
AND 論理で適用されるフィルターです。Tablestore は、すべてのフィルター条件に一致する行のみを返します。 |
|
should_queries |
OR 演算子です。Tablestore は、最低限指定された数のサブクエリ条件に一致する行を返します。行が一致する
|
|
minimum_should_match |
行が返されるために一致する必要のある |
使用例
以下の例では、各ブールクエリ句の使用方法を示します。すべての例で、クエリタイプとして QueryTypeConst::BOOL_QUERY を指定し、$otsClient->search($request) を呼び出しています。
AND
must_queries を使用して、すべての条件を必須とします。以下の例では、keyword フィールドが "keyword" に等しく、かつ long フィールドが範囲 [100, 101) に含まれる行を返します。
$request = array(
'table_name' => 'php_sdk_test',
'index_name' => 'php_sdk_test_search_index',
'search_query' => array(
'offset' => 0,
'limit' => 2,
'get_total_count' => true,
'query' => array(
'query_type' => QueryTypeConst::BOOL_QUERY,
'query' => array(
'must_queries' => array(
array(
'query_type' => QueryTypeConst::TERM_QUERY,
'query' => array(
'field_name' => 'keyword',
'term' => 'keyword'
)
),
array(
'query_type' => QueryTypeConst::RANGE_QUERY,
'query' => array(
'field_name' => 'long',
'range_from' => 100,
'include_lower' => true,
'range_to' => 101,
'include_upper' => false
)
)
),
)
),
'sort' => array(
array(
'field_sort' => array(
'field_name' => 'keyword',
'order' => SortOrderConst::SORT_ORDER_ASC
)
),
)
),
'columns_to_get' => array(
'return_type' => ColumnReturnTypeConst::RETURN_SPECIFIED,
'return_names' => array('keyword', 'long')
)
);
$response = $otsClient->search($request);
OR
should_queries と minimum_should_match を使用して、いずれかの条件に一致する行を返します。以下の例では、keyword フィールドが "keyword" に等しい、または long フィールドが範囲 [100, 101) に含まれる行を返します。
$request = array(
'table_name' => 'php_sdk_test',
'index_name' => 'php_sdk_test_search_index',
'search_query' => array(
'offset' => 0,
'limit' => 2,
'get_total_count' => true,
'query' => array(
'query_type' => QueryTypeConst::BOOL_QUERY,
'query' => array(
'should_queries' => array(
array(
'query_type' => QueryTypeConst::TERM_QUERY,
'query' => array(
'field_name' => 'keyword',
'term' => 'keyword'
)
),
array(
'query_type' => QueryTypeConst::RANGE_QUERY,
'query' => array(
'field_name' => 'long',
'range_from' => 100,
'include_lower' => true,
'range_to' => 101,
'include_upper' => false
)
)
),
'minimum_should_match' => 1
)
),
'sort' => array(
array(
'field_sort' => array(
'field_name' => 'keyword',
'order' => SortOrderConst::SORT_ORDER_ASC
)
),
)
),
'columns_to_get' => array(
'return_type' => ColumnReturnTypeConst::RETURN_SPECIFIED,
'return_names' => array('keyword', 'long')
)
);
$response = $otsClient->search($request);
NOT
must_not_queries を使用して、いずれかの条件に一致する行を除外します。以下の例では、keyword フィールドが "keyword" に等しい、または long フィールドが範囲 [100, 101) に含まれる行を除外します。つまり、NOT(条件 A OR 条件 B) となります。
$request = array(
'table_name' => 'php_sdk_test',
'index_name' => 'php_sdk_test_search_index',
'search_query' => array(
'offset' => 0,
'limit' => 2,
'get_total_count' => true,
'query' => array(
'query_type' => QueryTypeConst::BOOL_QUERY,
'query' => array(
'must_not_queries' => array(
array(
'query_type' => QueryTypeConst::TERM_QUERY,
'query' => array(
'field_name' => 'keyword',
'term' => 'keyword'
)
),
array(
'query_type' => QueryTypeConst::RANGE_QUERY,
'query' => array(
'field_name' => 'long',
'range_from' => 100,
'include_lower' => true,
'range_to' => 101,
'include_upper' => false
)
)
),
)
),
'sort' => array(
array(
'field_sort' => array(
'field_name' => 'keyword',
'order' => SortOrderConst::SORT_ORDER_ASC
)
),
)
),
'columns_to_get' => array(
'return_type' => ColumnReturnTypeConst::RETURN_SPECIFIED,
'return_names' => array('keyword', 'long')
)
);
$response = $otsClient->search($request);
filter_queries
関連性スコアを計算せずに AND 論理が必要な場合は、filter_queries を使用します。以下の例では、両方の条件に一致する行を返しますが、行が満たす条件の数に基づいてスコアリングは行いません。
$request = array(
'table_name' => 'php_sdk_test',
'index_name' => 'php_sdk_test_search_index',
'search_query' => array(
'offset' => 0,
'limit' => 2,
'get_total_count' => true,
'query' => array(
'query_type' => QueryTypeConst::BOOL_QUERY,
'query' => array(
'filter_queries' => array(
array(
'query_type' => QueryTypeConst::TERM_QUERY,
'query' => array(
'field_name' => 'keyword',
'term' => 'keyword'
)
),
array(
'query_type' => QueryTypeConst::RANGE_QUERY,
'query' => array(
'field_name' => 'long',
'range_from' => 100,
'include_lower' => true,
'range_to' => 101,
'include_upper' => false
)
)
),
)
),
'sort' => array(
array(
'field_sort' => array(
'field_name' => 'keyword',
'order' => SortOrderConst::SORT_ORDER_ASC
)
),
)
),
'columns_to_get' => array(
'return_type' => ColumnReturnTypeConst::RETURN_SPECIFIED,
'return_names' => array('keyword', 'long')
)
);
$response = $otsClient->search($request);
複合クエリ
ブールクエリをネストして、複雑な論理式を構築します。以下の例では、次の条件を満たす行を取得します:(col2 < 4 OR col3 < 5) OR (col2 = 4 AND (col3 = 5 OR col3 = 6))。
$request = array(
'table_name' => 'php_sdk_test',
'index_name' => 'php_sdk_test_index',
'search_query' => [
'offset' => 0,
'limit' => 10,
'get_total_count' => false,
'query' => [
'query_type' => QueryTypeConst::BOOL_QUERY,
'query' => [
// 最終的な結合条件: (col2 < 4 or col3 < 5) or (col2 = 4 and (col3 = 5 or col3 = 6))
'should_queries' => [
[
'query_type' => QueryTypeConst::BOOL_QUERY,
'query' => [
// 結合条件 1: col2 < 4 or col3 < 5
'should_queries' => [
[
'query_type' => QueryTypeConst::RANGE_QUERY,
// 条件 1: col2 < 4
'query' => [
'field_name' => 'col2',
'range_to' => 4
]
],
[
'query_type' => QueryTypeConst::RANGE_QUERY,
// 条件 2: col3 < 5
'query' => [
'field_name' => 'col3',
'range_to' => 5
]
]
]
]
],
[
'query_type' => QueryTypeConst::BOOL_QUERY,
// 結合条件 2: (col2 = 4 and (col3 = 5 or col3 = 6))
'query' => [
'must_queries' => [
[
'query_type' => QueryTypeConst::TERM_QUERY,
// 条件 3: col2 = 4
'query' => [
'field_name' => 'col2',
'term' => 4
]
],
[
'query_type' => QueryTypeConst::BOOL_QUERY,
// 結合条件 3: (col3 = 5 or col3 = 6)
'query' => [
'should_queries' => [
[
'query_type' => QueryTypeConst::TERM_QUERY,
// 条件 4: col3 = 5
'query' => [
'field_name' => 'col3',
'term' => 5
]
],
[
'query_type' => QueryTypeConst::TERM_QUERY,
// 条件 5: col3 = 6
'query' => [
'field_name' => 'col3',
'term' => 6
]
]
],
'minimum_should_match' => 1
]
]
]
]
]
],
'minimum_should_match' => 1
]
]
],
// columns_to_get パラメーターを設定して、返す列を指定するか、すべての列を返すように指定できます。このパラメーターを設定しない場合、プライマリキー列のみが返されます。
'columns_to_get' => [
//'return_type' => ColumnReturnTypeConst::RETURN_ALL // すべての列を返すように指定します。
// 指定された列を返すように指定します。
'return_type' => ColumnReturnTypeConst::RETURN_SPECIFIED,
'return_names' => array('col1', 'col2')
]
);
$response = $otsClient->search($request);
よくある質問
参考資料
多次元インデックスを使用してデータをクエリする際は、以下のクエリ方法を使用できます:完全一致検索、複数値完全一致検索、完全一致検索、一致検索、フレーズ一致検索、プレフィックス検索、範囲クエリ、ワイルドカード検索、ブールクエリ、ジオクエリ、ネストされたクエリ、およびexists クエリ。ビジネス要件に応じて、さまざまなクエリ方法を使用して多角的にデータをクエリできます。
クエリ条件を満たす行をソートまたはページングする場合は、ソートおよびページング機能を使用できます。詳細については、「ソートおよびページング」をご参照ください。
特定の列に基づいて結果セットを折りたたみたい場合は、折りたたみ(distinct)機能を使用できます。これにより、指定されたタイプのデータがクエリ結果に 1 回だけ表示されます。詳細については、「折りたたみ(distinct)」をご参照ください。
データテーブル内のデータを分析し、最大値・最小値、合計値、行数などを取得したい場合は、集約操作を実行するか、SQL ステートメントを実行できます。詳細については、「集約」および「SQL クエリ」をご参照ください。
行をソートする必要がなく、クエリ条件を満たすすべての行を迅速に取得したい場合は、ParallelScan 操作および ComputeSplits 操作を呼び出して並列スキャン機能を使用できます。詳細については、「並列スキャン」をご参照ください。