ES-单条件查询

本文介绍了如何使用DSL语句在idx_shop_sku_index索引中查询名称为'美团'的记录以及城市ID为120的数据。通过示例展示了匹配查询和术语查询在Elasticsearch中的应用,帮助理解数据检索的基本操作。
DSL语句:

GET /idx_shop_sku_index/sku_index/_search
{
"query":{
      "match":{
                "name":"美团"
      }
}
}

查询名称是美团的:


DSL语句:

  GET /idx_shop_sku_index/sku_index/_search
{

 "query": {
    "term": {
  "cityId": {
    "value": 120
     }
    }
}
}

查询城市id为120的数据;

<think> 我们正在使用Elasticsearch High Level REST Client进行查询和聚合操作。根据引用内容,聚合操作类似于SQL中的GROUP BY,常用的聚合函数包括avg、max、min、sum等。同时,引用[5]中给出了一个使用聚合的示例:通过创建AggregationBuilder并添加到SearchSourceBuilder中。 步骤: 1. 创建SearchRequest对象。 2. 创建SearchSourceBuilder对象,用于构建查询和聚合。 3. 构建聚合:使用AggregationBuilders创建聚合,例如按字段分组的TermsAggregationBuilder,并可以添加子聚合。 4. 将聚合添加到SearchSourceBuilder中。 5. 将SearchSourceBuilder设置到SearchRequest中。 6. 执行搜索请求,获取响应。 7. 从响应中解析聚合结果。 示例代码(参考引用[5]): 假设我们有一个索引,其中包含公司(company)和年龄(age)字段,我们想按公司分组并计算每个公司的平均年龄。 代码步骤: 1. 创建TermsAggregationBuilder,按公司字段(关键字类型)分组,命名为"by_company"。 2. 在该聚合下添加一个子聚合,计算平均年龄,命名为"average_age"。 3. 将聚合添加到SearchSourceBuilder中。 4. 执行搜索。 注意:在Elasticsearch中,对于文本字段进行聚合时,通常使用.keyword子字段,因为文本字段默认是分词的,而聚合需要完整的词条。 以下是示例代码: </think> ### Elasticsearch REST High Level Client 查询聚合方法详解 Elasticsearch 的聚合功能类似于 SQL 的 `GROUP BY`,通过 `RestHighLevelClient` 实现聚合需遵循以下步骤: --- #### 1. **创建聚合构建器** 使用 `AggregationBuilders` 定义聚合类型和字段: ```java // 主聚合:按公司分组(类似SQL的GROUP BY company) TermsAggregationBuilder companyAgg = AggregationBuilders.terms("by_company") .field("company.keyword"); // 对文本字段使用.keyword避免分词 // 子聚合:计算每组年龄平均值 companyAgg.subAggregation(AggregationBuilders.avg("average_age").field("age")); ``` - `"by_company"`:聚合结果的命名标识 - **关键点**:文本字段聚合需加 `.keyword` 后缀保证精确匹配[^4][^5] --- #### 2. **集成到查询请求** 将聚合添加到 `SearchSourceBuilder`: ```java SearchRequest searchRequest = new SearchRequest("your_index"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // 添加聚合到查询 sourceBuilder.aggregation(companyAgg); searchRequest.source(sourceBuilder); // 可选:添加查询条件(如范围查询) sourceBuilder.query(QueryBuilders.rangeQuery("age").gte(18)); ``` --- #### 3. **执行请求并解析结果** ```java RestHighLevelClient client = ... // 初始化客户端 SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); // 获取聚合结果 Terms byCompanyAgg = response.getAggregations().get("by_company"); for (Terms.Bucket bucket : byCompanyAgg.getBuckets()) { String company = bucket.getKeyAsString(); long docCount = bucket.getDocCount(); // 获取子聚合结果(平均年龄) Avg avgAge = bucket.getAggregations().get("average_age"); System.out.printf("公司: %s, 员工数: %d, 平均年龄: %.2f%n", company, docCount, avgAge.getValue()); } ``` --- #### 4. **常见聚合类型示例** | 聚合类型 | 构建方法示例 | 用途 | |------------------|-------------------------------------------|-------------------| | 平均值 | `AggregationBuilders.avg("avg_age").field("age")` | 计算字段平均值 | | 最大值/最小值 | `AggregationBuilders.max("max_salary").field("salary")` | 获取极值 | | 求和 | `AggregationBuilders.sum("total_sales").field("sales")` | 累加字段值 | | 多级分组(Composite) | 见引用[3] | 复杂分页聚合 | --- #### **注意事项** 1. 文本字段聚合必须使用 `.keyword` 子字段,否则会因分词导致错误分组[^4][^5] 2. 高版本兼容性:`RestHighLevelClient` 在 ES 7.15+ 已被标记为弃用,建议迁移至官方新客户端 `Elasticsearch Java API Client`[^2] 3. 性能优化:大数据集聚合时,可通过 `size` 参数限制分组数量(如 `.size(100)`) > 示例完整代码见引用[4][^4],聚合原理说明见引用[1][^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值