全部產品
Search
文件中心

:多條件組合查詢

更新時間:Jul 03, 2024

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

前提條件

參數

參數

說明

must_queries

多個Query列表,行資料必須滿足所有的子查詢條件才算匹配,等價於And操作符。

must_not_queries

多個Query列表,行資料必須不能滿足任何的子查詢條件才算匹配,等價於Not操作符。

filter_queries

多個Query列表,行資料必須滿足所有的子filter才算匹配,filter類似於query,區別是filter不會根據滿足的filter個數進行相關性算分。

should_queries

多個Query列表,可以滿足,也可以不滿足,等價於Or操作符。

行資料應該至少滿足should_queries子查詢條件的最小匹配個數才算匹配。

如果滿足的should_queries子查詢條件個數越多,則整體的相關性分數更高。

minimum_should_match

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

table_name

資料表名稱。

index_name

多元索引名稱。

樣本

以下樣本用於通過BoolQuery進行多條件組合查詢。

  • 5.2.1及之後版本

    使用5.2.1及之後的SDK版本時,預設的返回結果為SearchResponse對象,請求樣本如下:

    # Col_Keyword > 'key100' and (Col_Long > 110 and Col_Long < 200) and not (Col_Keyword = 'key121') and
    # should_queries(Col_Keyword > 'key120' or Col_Long < 300, minimum_should_match = 2)
    bool_query = BoolQuery(
        must_queries=[
            RangeQuery('Col_Keyword', range_from='key100', include_lower=False),
            # 多條件組合查詢。
            BoolQuery(
                # 設定需要滿足的子查詢條件。
                must_queries=[
                    RangeQuery('Col_Long', range_from=110, include_lower=False),
                    RangeQuery('Col_Long', range_to=200, include_upper=False)
                ],
            )
        ],
        # 設定需要排除的子查詢條件。
        must_not_queries=[
            TermQuery('Col_Keyword', 'key121')
        ],
        should_queries=[
            RangeQuery('Col_Keyword', range_from='key120', include_lower=False),
            RangeQuery('Col_Long', range_to=300, include_upper=130)
        ],
        minimum_should_match=2
    )
    # 構造完整查詢語句,包括排序的列,返回前100行以及返回查詢結果總的行數。
    search_response = client.search(
        '<TABLE_NAME>', '<SEARCH_INDEX_NAME>',
        SearchQuery(
            bool_query,
            sort=Sort(sorters=[FieldSort('Col_Long', SortOrder.ASC)]),
            limit=100,
            get_total_count=True),
        ColumnsToGet(return_type=ColumnReturnType.ALL)
    )
    print('request_id : %s' % search_response.request_id)
    print('is_all_succeed : %s' % search_response.is_all_succeed)
    print('total_count : %s' % search_response.total_count)
    print('rows : %s' % search_response.rows)

    如果需要返回Tuple類型結果,您可以使用如下請求樣本實現。

    # Col_Keyword > 'key100' and (Col_Long > 110 and Col_Long < 200) and not (Col_Keyword = 'key121') and 
    # should_queries(Col_Keyword > 'key120' or Col_Long < 300, minimum_should_match = 2) 
    bool_query = BoolQuery(
        must_queries=[
            RangeQuery('Col_Keyword', range_from='key100', include_lower=False),
            # 多條件組合查詢。
            BoolQuery(
                # 設定需要滿足的子查詢條件。
                must_queries=[
                    RangeQuery('Col_Long', range_from=110, include_lower=False),
                    RangeQuery('Col_Long', range_to=200, include_upper=False)
                ],
            )
        ],
        # 設定需要排除的子查詢條件。
        must_not_queries=[
            TermQuery('Col_Keyword', 'key121')
        ],
        should_queries=[
            RangeQuery('Col_Keyword', range_from='key120', include_lower=False),
            RangeQuery('Col_Long', range_to=300, include_upper=130)
        ],
        minimum_should_match=2
    )
    # 構造完整查詢語句,包括排序的列,返回前100行以及返回查詢結果總的行數。
    rows, next_token, total_count, is_all_succeed, agg_results, group_by_results = client.search(
        '<TABLE_NAME>', '<SEARCH_INDEX_NAME>',
        SearchQuery(
            bool_query,
            sort=Sort(sorters=[FieldSort('Col_Long', SortOrder.ASC)]),
            limit=100,
            get_total_count=True),
        ColumnsToGet(return_type=ColumnReturnType.ALL)
    ).v1_response()
  • 5.2.1之前版本

    使用5.2.1之前的SDK版本時,預設的返回結果為Tuple類型,請求樣本如下:

    # Col_Keyword > 'key100' and (Col_Long > 110 and Col_Long < 200) and not (Col_Keyword = 'key121') and 
    # should_queries(Col_Keyword > 'key120' or Col_Long < 300, minimum_should_match = 2) 
    bool_query = BoolQuery(
        must_queries=[
            RangeQuery('Col_Keyword', range_from='key100', include_lower=False),
            # 多條件組合查詢。
            BoolQuery(
                # 設定需要滿足的子查詢條件。
                must_queries=[
                    RangeQuery('Col_Long', range_from=110, include_lower=False),
                    RangeQuery('Col_Long', range_to=200, include_upper=False)
                ],
            )
        ],
        # 設定需要排除的子查詢條件。
        must_not_queries=[
            TermQuery('Col_Keyword', 'key121')
        ],
        should_queries=[
            RangeQuery('Col_Keyword', range_from='key120', include_lower=False),
            RangeQuery('Col_Long', range_to=300, include_upper=130)
        ],
        minimum_should_match=2
    )
    # 構造完整查詢語句,包括排序的列,返回前100行以及返回查詢結果總的行數。
    rows, next_token, total_count, is_all_succeed = client.search(
        '<TABLE_NAME>', '<SEARCH_INDEX_NAME>',
        SearchQuery(
            bool_query,
            sort=Sort(sorters=[FieldSort('Col_Long', SortOrder.ASC)]),
            limit=100,
            get_total_count=True),
        ColumnsToGet(return_type=ColumnReturnType.ALL)
    )

常見問題

相關文檔