多條件組合查詢
前提條件
已初始化OTSClient。具體操作,請參見初始化Tablestore Client。
已在資料表上建立多元索引。具體操作,請參見建立多元索引。
參數
|
參數 |
說明 |
|
table_name |
資料表名稱。 |
|
index_name |
多元索引名稱。 |
|
must_queries |
AND 條件,等價於邏輯運算子 AND。只返回滿足所有子查詢條件的行。 |
|
must_not_queries |
NOT 條件,等價於邏輯運算子 NOT。只返回不滿足任一子查詢條件的行。指定多個子查詢時,等價於 NOT(A OR B)——某行只要滿足其中任意一個子查詢,就會被排除。 |
|
filter_queries |
過濾條件,以 AND 邏輯執行。只返回滿足所有過濾條件的行。與 |
|
should_queries |
OR 條件,等價於邏輯運算子 OR。返回滿足至少 滿足的子查詢條件越多,該行的相關性得分越高。 通過 |
|
minimum_should_match |
|
樣本
以下樣本展示各類條件組合的用法,均通過 $otsClient->search($request) 調用,查詢類型為 QueryTypeConst::BOOL_QUERY。
And條件查詢
用 must_queries 實現 AND 邏輯:返回同時滿足條件 A 和條件 B 的行。以下樣本返回 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 實現 OR 邏輯:返回滿足條件 A 或條件 B 中至少一個的行。以下樣本返回 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 排除滿足任一條件的行,等價於 NOT(A OR B):返回既不滿足條件 A、也不滿足條件 B 的行。以下樣本排除 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_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條件查詢
用 filter_queries 實現不計算相關性得分的 AND 過濾:只過濾資料,不影響相關性排序。以下樣本返回同時滿足兩個條件的行,行資料不會因滿足條件個數的多少而產生相關性得分差異。
$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);
組合查詢
嵌套多個 BoolQuery 可構造任意複雜的邏輯組合。以下樣本實現邏輯運算式 (col2 < 4 OR col3 < 5) OR (col2 = 4 AND (col3 = 5 OR col3 = 6)),其中每個 AND 或 OR 對應一個 BoolQuery。
$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);
常見問題
相關文檔
多元索引查詢類型包括精確查詢、多詞精確查詢、全匹配查詢、匹配查詢、短語匹配查詢、首碼查詢、範圍查詢、萬用字元查詢、多條件組合查詢、地理位置查詢、巢狀型別查詢和列存在性查詢,您可以選擇合適的查詢類型進行多維度資料查詢。
如果要對結果集進行排序或者翻頁,您可以使用排序和翻頁功能來實現。具體操作,請參見排序和翻頁。
如果要按照某一列對結果集做摺疊,使對應類型的資料在結果展示中只出現一次,您可以使用摺疊(去重)功能來實現。具體操作,請參見摺疊(去重)。
如果要進行資料分析,例如求最值、求和、統計行數等,您可以使用Search介面的統計彙總功能或者SQL查詢來實現。具體操作,請參見統計彙總和SQL查詢。
如果要快速匯出資料,而不關心整個結果集的順序時,您可以使用ParallelScan介面和ComputeSplits介面實現多並發匯出資料。具體操作,請參見並發匯出資料。