- Elasticsearch查询语句详解
- 一、查询语句基本结构
- 基本语法格式
- 二、基础查询类型
- 1. 匹配查询(Match Query)
- 2. 精确查询(Term Query)
- 3. 范围查询(Range Query)
- 4. 多词条查询(Terms Query)
- 5. 存在查询(Exists Query)
- 三、复合查询
- 1. 布尔查询(Bool Query)
- 2. 多字段查询(Multi Match Query)
- 四、分页与排序
- 1. 基本分页
- 2. 排序
- 3. 游标分页(Search After)
- 五、字段过滤
- 1. 返回指定字段
- 2. 排除字段
- 六、聚合查询
- 1. 指标聚合(Metrics Aggregation)
- 2. 桶聚合(Bucket Aggregation)
- 3. 日期直方图聚合
- 七、高亮显示
- 八、查询性能优化
- 1. 使用filter代替query
- 2. 避免深度分页
- 3. 控制返回字段
- 九、常用查询示例
- 1. 多条件组合查询
- 2. 模糊查询
- 3. 前缀查询
- Elasticsearch查询语句详解
- 一、查询语句基本结构
- 基本语法格式
- 二、基础查询类型
- 1. 匹配查询(Match Query)
- 2. 精确查询(Term Query)
- 3. 范围查询(Range Query)
- 4. 多词条查询(Terms Query)
- 5. 存在查询(Exists Query)
- 三、复合查询
- 1. 布尔查询(Bool Query)
- 2. 多字段查询(Multi Match Query)
- 四、分页与排序
- 1. 基本分页
- 2. 排序
- 3. 游标分页(Search After)
- 五、字段过滤
- 1. 返回指定字段
- 2. 排除字段
- 六、聚合查询
- 1. 指标聚合(Metrics Aggregation)
- 2. 桶聚合(Bucket Aggregation)
- 3. 日期直方图聚合
- 七、高亮显示
- 八、查询性能优化
- 1. 使用filter代替query
- 2. 避免深度分页
- 3. 控制返回字段
- 九、常用查询示例
- 1. 多条件组合查询
- 2. 模糊查询
- 3. 前缀查询
Elasticsearch查询语句详解
一、查询语句基本结构
Elasticsearch使用基于JSON的查询DSL(Domain Specific Language),所有查询都通过HTTP API发送到_search端点。
基本语法格式
GET /index_name/_search
{
"query": {
// 查询条件
},
"from": 0,
// 分页起始位置
"size": 10,
// 返回结果数量
"sort": [
// 排序规则
],
"_source": [
// 返回字段列表
],
"aggs": {
// 聚合查询
}
}二、基础查询类型
1. 匹配查询(Match Query)
GET /books/_search
{
"query": {
"match": {
"title": "Elasticsearch入门"
}
}
}特点:对字段进行分词后查询,支持全文搜索
2. 精确查询(Term Query)
GET /books/_search
{
"query": {
"term": {
"author.keyword": "张三"
}
}
}特点:不进行分词,完全匹配字段值,适合keyword类型字段
3. 范围查询(Range Query)
GET /books/_search
{
"query": {
"range": {
"price": {
"gte": 50,
"lte": 100
}
}
}
}操作符:
gte:大于等于gt:大于lte:小于等于lt:小于
4. 多词条查询(Terms Query)
GET /books/_search
{
"query": {
"terms": {
"category.keyword": ["技术", "编程", "数据库"]
}
}
}特点:匹配多个值,相当于SQL中的IN查询
5. 存在查询(Exists Query)
GET /books/_search
{
"query": {
"exists": {
"field": "description"
}
}
}特点:查询包含指定字段的文档
三、复合查询
1. 布尔查询(Bool Query)
GET /books/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } }
],
"filter": [
{ "range": { "price": { "gte": 50 } } }
],
"must_not": [
{ "term": { "status": "下架" } }
],
"should": [
{ "match": { "description": "入门" } },
{ "match": { "description": "教程" } }
],
"minimum_should_match": 1
}
}
}子句说明:
must:必须匹配,贡献相关性得分filter:必须匹配,不贡献得分,可缓存must_not:必须不匹配should:应该匹配,至少满足minimum_should_match个条件
2. 多字段查询(Multi Match Query)
GET /books/_search
{
"query": {
"multi_match": {
"query": "Elasticsearch教程",
"fields": ["title", "description"]
}
}
}特点:在多个字段中搜索同一个查询词
四、分页与排序
1. 基本分页
GET /books/_search
{
"from": 0,
"size": 20,
"query": {
"match_all": {}
}
}注意:深度分页(from > 10000)性能较差,建议使用search_after
2. 排序
GET /books/_search
{
"sort": [
{ "price": { "order": "desc" } },
{ "_score": { "order": "desc" } }
],
"query": {
"match": { "title": "Elasticsearch" }
}
}3. 游标分页(Search After)
GET /books/_search
{
"size": 20,
"query": {
"match_all": {}
},
"sort": [
{ "create_time": "desc" },
{ "_id": "asc" }
],
"search_after": ["2025-12-22T10:30:00", "book_123"]
}特点:适合深度分页,基于上一页最后一条记录继续查询
五、字段过滤
1. 返回指定字段
GET /books/_search
{
"_source": ["title", "author", "price"],
"query": {
"match_all": {}
}
}2. 排除字段
GET /books/_search
{
"_source": {
"excludes": ["description", "content"]
},
"query": {
"match_all": {}
}
}六、聚合查询
1. 指标聚合(Metrics Aggregation)
GET /books/_search
{
"size": 0,
"aggs": {
"avg_price": {
"avg": { "field": "price" }
},
"max_price": {
"max": { "field": "price" }
},
"min_price": {
"min": { "field": "price" }
}
}
}2. 桶聚合(Bucket Aggregation)
GET /books/_search
{
"size": 0,
"aggs": {
"category_count": {
"terms": {
"field": "category.keyword",
"size": 10
}
}
}
}3. 日期直方图聚合
GET /books/_search
{
"size": 0,
"aggs": {
"sales_by_month": {
"date_histogram": {
"field": "create_time",
"calendar_interval": "month",
"format": "yyyy-MM"
}
}
}
}七、高亮显示
GET /books/_search
{
"query": {
"match": { "title": "Elasticsearch" }
},
"highlight": {
"fields": {
"title": {},
"description": {}
},
"pre_tags": ["<em>"],
"post_tags": ["</em>"]
}
}八、查询性能优化
1. 使用filter代替query
GET /books/_search
{
"query": {
"bool": {
"filter": [
{ "range": { "price": { "gte": 50 } } }
]
}
}
}优势:filter不计算相关性得分,可缓存,性能更好
2. 避免深度分页
- 使用
search_after替代from/size - 使用scroll API处理大量数据导出
3. 控制返回字段
- 使用
_source过滤不需要的字段 - 避免返回大文本字段
九、常用查询示例
1. 多条件组合查询
GET /books/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } }
],
"filter": [
{ "range": { "price": { "gte": 30, "lte": 100 } } },
{ "terms": { "category.keyword": ["技术", "编程"] } }
]
}
},
"from": 0,
"size": 20,
"sort": [
{ "price": "desc" }
],
"_source": ["title", "author", "price", "category"]
}2. 模糊查询
GET /books/_search
{
"query": {
"fuzzy": {
"title": {
"value": "elastic",
"fuzziness": "AUTO"
}
}
}
}3. 前缀查询
GET /books/_search
{
"query": {
"prefix": {
"title.keyword": "Elastic"
}
}
}通过掌握这些查询语句,您可以灵活地构建各种复杂的搜索场景,满足不同的业务需求。
Elasticsearch查询语句详解
一、查询语句基本结构
Elasticsearch使用基于JSON的查询DSL(Domain Specific Language),所有查询都通过HTTP API发送到_search端点。
基本语法格式
GET /index_name/_search
{
"query": {
// 查询条件
},
"from": 0,
// 分页起始位置
"size": 10,
// 返回结果数量
"sort": [
// 排序规则
],
"_source": [
// 返回字段列表
],
"aggs": {
// 聚合查询
}
}二、基础查询类型
1. 匹配查询(Match Query)
GET /books/_search
{
"query": {
"match": {
"title": "Elasticsearch入门"
}
}
}特点:对字段进行分词后查询,支持全文搜索
2. 精确查询(Term Query)
GET /books/_search
{
"query": {
"term": {
"author.keyword": "张三"
}
}
}特点:不进行分词,完全匹配字段值,适合keyword类型字段
3. 范围查询(Range Query)
GET /books/_search
{
"query": {
"range": {
"price": {
"gte": 50,
"lte": 100
}
}
}
}操作符:
gte:大于等于gt:大于lte:小于等于lt:小于
4. 多词条查询(Terms Query)
GET /books/_search
{
"query": {
"terms": {
"category.keyword": ["技术", "编程", "数据库"]
}
}
}特点:匹配多个值,相当于SQL中的IN查询
5. 存在查询(Exists Query)
GET /books/_search
{
"query": {
"exists": {
"field": "description"
}
}
}特点:查询包含指定字段的文档
三、复合查询
1. 布尔查询(Bool Query)
GET /books/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } }
],
"filter": [
{ "range": { "price": { "gte": 50 } } }
],
"must_not": [
{ "term": { "status": "下架" } }
],
"should": [
{ "match": { "description": "入门" } },
{ "match": { "description": "教程" } }
],
"minimum_should_match": 1
}
}
}子句说明:
must:必须匹配,贡献相关性得分filter:必须匹配,不贡献得分,可缓存must_not:必须不匹配should:应该匹配,至少满足minimum_should_match个条件
2. 多字段查询(Multi Match Query)
GET /books/_search
{
"query": {
"multi_match": {
"query": "Elasticsearch教程",
"fields": ["title", "description"]
}
}
}特点:在多个字段中搜索同一个查询词
四、分页与排序
1. 基本分页
GET /books/_search
{
"from": 0,
"size": 20,
"query": {
"match_all": {}
}
}注意:深度分页(from > 10000)性能较差,建议使用search_after
2. 排序
GET /books/_search
{
"sort": [
{ "price": { "order": "desc" } },
{ "_score": { "order": "desc" } }
],
"query": {
"match": { "title": "Elasticsearch" }
}
}3. 游标分页(Search After)
GET /books/_search
{
"size": 20,
"query": {
"match_all": {}
},
"sort": [
{ "create_time": "desc" },
{ "_id": "asc" }
],
"search_after": ["2025-12-22T10:30:00", "book_123"]
}特点:适合深度分页,基于上一页最后一条记录继续查询
五、字段过滤
1. 返回指定字段
GET /books/_search
{
"_source": ["title", "author", "price"],
"query": {
"match_all": {}
}
}2. 排除字段
GET /books/_search
{
"_source": {
"excludes": ["description", "content"]
},
"query": {
"match_all": {}
}
}六、聚合查询
1. 指标聚合(Metrics Aggregation)
GET /books/_search
{
"size": 0,
"aggs": {
"avg_price": {
"avg": { "field": "price" }
},
"max_price": {
"max": { "field": "price" }
},
"min_price": {
"min": { "field": "price" }
}
}
}2. 桶聚合(Bucket Aggregation)
GET /books/_search
{
"size": 0,
"aggs": {
"category_count": {
"terms": {
"field": "category.keyword",
"size": 10
}
}
}
}3. 日期直方图聚合
GET /books/_search
{
"size": 0,
"aggs": {
"sales_by_month": {
"date_histogram": {
"field": "create_time",
"calendar_interval": "month",
"format": "yyyy-MM"
}
}
}
}七、高亮显示
GET /books/_search
{
"query": {
"match": { "title": "Elasticsearch" }
},
"highlight": {
"fields": {
"title": {},
"description": {}
},
"pre_tags": ["<em>"],
"post_tags": ["</em>"]
}
}八、查询性能优化
1. 使用filter代替query
GET /books/_search
{
"query": {
"bool": {
"filter": [
{ "range": { "price": { "gte": 50 } } }
]
}
}
}优势:filter不计算相关性得分,可缓存,性能更好
2. 避免深度分页
- 使用
search_after替代from/size - 使用scroll API处理大量数据导出
3. 控制返回字段
- 使用
_source过滤不需要的字段 - 避免返回大文本字段
九、常用查询示例
1. 多条件组合查询
GET /books/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } }
],
"filter": [
{ "range": { "price": { "gte": 30, "lte": 100 } } },
{ "terms": { "category.keyword": ["技术", "编程"] } }
]
}
},
"from": 0,
"size": 20,
"sort": [
{ "price": "desc" }
],
"_source": ["title", "author", "price", "category"]
}2. 模糊查询
GET /books/_search
{
"query": {
"fuzzy": {
"title": {
"value": "elastic",
"fuzziness": "AUTO"
}
}
}
}3. 前缀查询
GET /books/_search
{
"query": {
"prefix": {
"title.keyword": "Elastic"
}
}
}通过掌握这些查询语句,您可以灵活地构建各种复杂的搜索场景,满足不同的业务需求。
作者:严锋 创建时间:2025-12-22 21:05
最后编辑:严锋 更新时间:2025-12-25 10:39
最后编辑:严锋 更新时间:2025-12-25 10:39