多條件組合查詢

更新時間:
Copy as MD

多條件組合查詢(BoolQuery)的查詢條件包含一個或者多個子查詢條件,根據子查詢條件來判斷一行資料是否滿足查詢條件。每個子查詢條件可以是任意一種Query類型,包括BoolQuery。

前提條件

參數

參數

說明

table_name

資料表名稱。

index_name

多元索引名稱。

must_queries

AND 條件,等價於邏輯運算子 AND。只返回滿足所有子查詢條件的行。

must_not_queries

NOT 條件,等價於邏輯運算子 NOT。只返回不滿足任一子查詢條件的行。指定多個子查詢時,等價於 NOT(A OR B)——某行只要滿足其中任意一個子查詢,就會被排除。

filter_queries

過濾條件,以 AND 邏輯執行。只返回滿足所有過濾條件的行。與 must_queries 的區別:filter_queries 不計算相關性得分,適合純過濾情境。

should_queries

OR 條件,等價於邏輯運算子 OR。返回滿足至少 minimum_should_match 個子查詢條件的行。

滿足的子查詢條件越多,該行的相關性得分越高。

通過 minimum_should_match 指定最少需要滿足的子查詢個數。

minimum_should_match

should_queries 子查詢條件的最小匹配個數。當同級沒有其他Query,只有should_queries時,預設值為1;當同級已有其他Query,例如must_queries、must_not_queriesfilter_queries時,預設值為0。

樣本

以下樣本展示各類條件組合的用法,均通過 $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);

常見問題

相關文檔