Elasticsearch 各种条件查询案例
时间: 2025-06-14 15:11:31 浏览: 20
<think>我们正在处理一个关于Elasticsearch条件查询使用案例和示例的请求。根据用户要求,我们需要提供清晰的结构和真实可靠的示例。同时,我们需要参考提供的引用内容,并遵循系统级指令(如数学公式格式、中文回答、生成相关问题等)。根据引用内容,我们可以总结如下:引用[1]:提到了Elasticsearch的多条件查询和KQL的使用。引用[2]:提供了match查询的示例(包括KibanaDevTools和Java代码)。引用[3]:展示了使用curl进行match查询的示例。引用[4]:给出了Java调用Elasticsearch查询API的示例(包括依赖和代码)。用户需要各种条件查询的使用案例和示例。因此,我们将介绍几种常见的条件查询,并给出示例。常见的条件查询类型包括:1.match查询:全文搜索,会对查询字符串分词。2.term查询:精确匹配,不分析查询字符串。3.bool查询:组合多个查询条件(must,should,must_not,filter)。4.range查询:范围查询(日期、数字等)。5.多条件组合:使用bool查询组合多个条件。我们将分别给出这些查询的示例,包括KibanaDevTools的DSL示例和Java代码示例(参考引用[2]和[4])。注意:在示例中,我们假设索引名为`my_index`,并且有字段如`title`(文本类型)、`status`(关键字类型)、`price`(数值类型)、`create_time`(日期类型)等。步骤:1.介绍每种查询类型。2.给出KibanaDevTools中的查询DSL示例。3.给出Java代码示例(使用RestHighLevelClient)。同时,在最后生成相关问题。由于用户要求使用中文回答,我们将用中文编写。</think>### Elasticsearch 条件查询使用案例与示例
Elasticsearch 提供多种条件查询方式,以下是常见场景的详细案例和代码示例(包含 Kibana Dev Tools 和 Java API):
---
#### 1. **单字段精确匹配(Term Query)
场景:查找`status`字段值为`"published"`的文档**
```json
GET /articles/_search
{
"query": {
"term": {
"status.keyword": "published"
}
}
}
```
> ✅ **说明**:
> - `term`查询适用于关键字(keyword)类型字段的精确匹配
> - `.keyword`后缀确保不触发分词器[^2]
---
#### 2. **多条件组合(Bool Query)
场景:筛选价格≥100且库存>0的商品**
```json
GET /products/_search
{
"query": {
"bool": {
"must": [
{ "range": { "price": { "gte": 100 } } },
{ "range": { "stock": { "gt": 0 } } }
],
"filter": [
{ "term": { "category.keyword": "electronics" } }
]
}
}
}
```
> ✅ **关键点**:
> - `must`:所有条件必须满足(参与相关性评分)
> - `filter`:过滤条件(不参与评分,性能更高)[^1]
> - `range`:支持`gt`(>)/`gte`(≥)/`lt`(<)/`lte`(≤)
---
#### 3. **全文搜索(Match Query)
场景:在`title`字段中搜索"Elasticsearch 教程"**
```json
GET /tutorials/_search
{
"query": {
"match": {
"title": {
"query": "Elasticsearch 教程",
"operator": "and" // 要求同时包含两个词
}
}
}
}
```
> ✅ **特性**:
> - 对查询文本分词后匹配(如"Elasticsearch"和"教程")
> - `operator`参数控制逻辑关系(`and`/`or`)[^3]
---
#### 4. **多字段搜索(Multi-Match)
场景:在`title`和`description`中搜索"数据分析"**
```json
GET /reports/_search
{
"query": {
"multi_match": {
"query": "数据分析",
"fields": ["title^3", "description"], // ^3表示title字段权重更高
"type": "best_fields"
}
}
}
```
---
#### 5. **Java API 实现多条件查询**
```java
// 依赖:elasticsearch-rest-high-level-client (版本需匹配ES服务)
SearchRequest request = new SearchRequest("orders");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 组合bool查询
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
.must(QueryBuilders.rangeQuery("amount").gte(500)) // 金额≥500
.should(QueryBuilders.matchQuery("payment_method", "credit_card")) // 优先信用卡
.filter(QueryBuilders.termQuery("status.keyword", "completed")); // 状态为已完成
sourceBuilder.query(boolQuery);
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
```
> ✅ **说明**:
> - `must`/`should`/`filter`对应DSL的同名字段
> - Java API 与 Kibana 查询结构完全兼容[^4]
---
### 最佳实践建议
1. **字段类型敏感**:
- 精确匹配用`term` + `.keyword`
- 文本搜索用`match`
2. **性能优化**:
- 频繁过滤条件放在`filter`中(利用缓存)
- 避免通配符查询`wildcard`
3. **Kibana 调试**:
- 使用Dev Tools实时验证DSL语法
- 通过`_explain`API分析评分逻辑
> 多条件查询是ES的核心能力,合理组合`bool`和`filter`可显著提升搜索效率[^1]。
阅读全文
相关推荐


















