ExistsQuery也叫NULL查询或者空值查询,一般用于判断稀疏数据中某一行的某一列是否存在。例如查询所有数据中address列不为空的行。

说明
  • 要对Nested字段进行列存在性查询(ExistsQuery)时,请使用嵌套类型查询(NestedQuery)进行嵌套。
  • 如果需要查询某一列为空,则ExistsQuery需要和BoolQuery中的mustNotQueries结合使用。
  • 以下情况会认为某一列不存在,以city列为例说明。
    • city列在多元索引中的数据类型为keyword(或其他基础类型),如果数据表中某行数据不存在city列,则多元索引认为该行数据的city列不存在。
    • city列在多元索引中的数据类型为keyword(或其他基础类型)数组,如果数据表中某行数据的city列为空数组,即"city" = "[]",则多元索引认为该行数据的city列不存在。

接口

列存在性查询的接口为Search或者ParallelScan,具体的Query类型为ExistsQuery。

使用

您可以使用如下语言的SDK实现列存在性查询。

参数

参数 说明
fieldName 列名。
query 设置查询类型为ExistsQuery。
getTotalCount 是否返回匹配的总行数,默认为false,表示不返回。

返回匹配的总行数会影响查询性能。

tableName 数据表名称。
indexName 多元索引名称。
columnsToGet 是否返回所有列,包含returnAll和columns设置。

returnAll默认为false,表示不返回所有列,此时可以通过columns指定返回的列;如果未通过columns指定返回的列,则只返回主键列。

当设置returnAll为true时,表示返回所有列。

示例

public void existQuery(SyncClient syncClient) {
    //非Nested类型字段col_keyword是否存在。
    {
        {
            //非Nested类型字段query示例。
            SearchQuery searchQuery = new SearchQuery();
            ExistsQuery existQuery = new ExistsQuery(); //设置查询类型为ExistsQuery。
            existQuery.setFieldName("col_keyword");
            searchQuery.setQuery(existQuery);
            SearchRequest searchRequest = new SearchRequest(tableName, indexName, searchQuery);
            SearchResponse resp = syncClient.search(searchRequest);
        }
        {
            //builder写法。
            SearchResponse resp = syncClient.search(SearchRequest.newBuilder()
                    .indexName(indexName)
                    .tableName(tableName)
                    .searchQuery(
                            SearchQuery.newBuilder()
                                    .query(QueryBuilders.exists("col_keyword"))
                                    .limit(10)
                                    .build())
                    .build());
        }
    }
    //Nested结构为{"col_nested":[{keyword:"a","long":123}]}。
    {
        //Nested类型父字段col_nested是否存在。
        {
            SearchResponse resp = syncClient.search(SearchRequest.newBuilder()
                    .indexName(indexName)
                    .tableName(tableName)
                    .searchQuery(
                            SearchQuery.newBuilder()
                                    .query(QueryBuilders.nested()
                                            .scoreMode(ScoreMode.None)
                                            .path("col_nested")
                                            .query(QueryBuilders.exists("col_nested")))
                                    .limit(10)
                                    .getTotalCount(false)
                                    .build())
                    .build());
        }
        //Nested类型字段col_nested.keyword是否存在。
        {
            SearchResponse resp = syncClient.search(SearchRequest.newBuilder()
                    .indexName(indexName)
                    .tableName(tableName)
                    .searchQuery(
                            SearchQuery.newBuilder()
                                    .query(QueryBuilders.nested()
                                            .scoreMode(ScoreMode.None)
                                            .path("col_nested")
                                            .query(QueryBuilders.exists("col_nested.keyword")))
                                    .limit(10)
                                    .getTotalCount(false)
                                    .build())
                    .build());
        }
    }
}