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());
}
}
}