ES如何实现一次检索多个检索条件

ES 如何实现在一次检索中既用AggregationBuilders.count统计某一字段的个数又把这个个数作为检索条件。类似select count(personId) as num from tableName where num<5

在 Elasticsearch 中,可以使用 Bool Query 来实现在一次检索中添加多个检索条件。

首先, 使用 AggregationBuilders.count() 来统计某一字段的个数,然后将这个统计结果作为条件进行查询。

示例代码如下:

SearchRequestBuilder srb = client.prepareSearch("indexName")
    .setTypes("typeName")
    .setQuery(QueryBuilders.boolQuery()
        .must(QueryBuilders.termQuery("personId", "value"))
        .filter(QueryBuilders.rangeQuery("num").lt(5))
    )
    .addAggregation(AggregationBuilders.count("num").field("personId"))
    .setSize(0);
SearchResponse sr = srb.execute().actionGet();

其中,setQuery() 方法中的 boolQuery() 可以添加多个查询条件,must() 方法用于添加必须满足的条件,filter() 方法用于添加过滤条件。

在这个例子中,先用 termQuery() 添加 personId 的查询条件,然后使用 rangeQuery() 添加 num 的过滤条件,最后调用 addAggregation() 方法添加统计聚合。

最后调用 execute() 方法执行查询,actionGet() 方法可以获取查询结果。

在这个例子中,我们实现了在一次检索中同时使用聚合和查询条件的功能,你可以根据需要在其上面做更改。

你如果想使用 SQL 来做查询,请阅读我的文章:

针对你的问题,你可以使用如下的方法来试试:

GET /_sql?
{
  "query": """
    SELECT COUNT(customer_id) as num FROM kibana_sample_data_ecommerce GROUP BY customer_id HAVING num BETWEEN 0 AND 100
  """
}

GET /_sql/translate
{
  "query": """
    SELECT COUNT(customer_id) as num FROM kibana_sample_data_ecommerce GROUP BY customer_id HAVING num BETWEEN 0 AND 100
  """
}