1. Elasticsearch基础查询语法入门指南
作为一款分布式搜索和分析引擎,Elasticsearch(简称ES)的查询语法是每个开发者必须掌握的核心技能。我在实际项目中使用ES已有5年多时间,今天就来分享最实用的基础查询语法,帮你快速上手这个强大的工具。
ES查询主要分为两类:简单查询(如term、match)和复合查询(如bool)。理解这些基础语法后,你就能处理80%的日常搜索需求。下面我会用实际案例演示最常见的几种查询方式。
2. 基础查询类型详解
2.1 精确查询:term与terms
term查询用于精确匹配某个字段的值,不会对查询文本进行分词处理。这在搜索ID、状态码等字段时特别有用:
{ "query": { "term": { "status": { "value": "published" } } } }如果需要同时匹配多个值,可以使用terms查询:
{ "query": { "terms": { "tags": ["python", "database"] } } }注意:term查询对大小写敏感,且要求字段类型为keyword。如果字段是text类型,建议改用match查询。
2.2 全文检索:match与multi_match
match查询会对查询文本进行分词处理,适合搜索文章内容等文本字段:
{ "query": { "match": { "content": "Elasticsearch基础教程" } } }multi_match则允许在多个字段中搜索相同的关键词:
{ "query": { "multi_match": { "query": "搜索语法", "fields": ["title", "content", "description"] } } }2.3 范围查询:range
range查询用于数值或日期范围的筛选:
{ "query": { "range": { "price": { "gte": 100, "lte": 500 } } } }支持的操作符包括:
- gt:大于
- gte:大于等于
- lt:小于
- lte:小于等于
3. 复合查询实战
3.1 bool查询:组合多个条件
bool查询是ES中最强大的查询类型,可以组合多个查询条件:
{ "query": { "bool": { "must": [ { "match": { "title": "教程" } } ], "filter": [ { "term": { "status": "published" } }, { "range": { "date": { "gte": "2023-01-01" } } } ], "must_not": [ { "term": { "category": "premium" } } ] } } }bool查询包含四种子句:
- must:必须匹配,贡献相关性分数
- should:应该匹配,贡献相关性分数
- must_not:必须不匹配,不贡献分数
- filter:必须匹配,但不贡献分数
3.2 分页与排序
实现分页查询需要用到from和size参数:
{ "query": { "match_all": {} }, "from": 10, "size": 5, "sort": [ { "date": { "order": "desc" } }, "_score" ] }提示:深度分页(如from=10000)会影响性能,建议改用search_after参数。
4. 聚合查询基础
4.1 指标聚合
计算数值字段的统计信息:
{ "aggs": { "avg_price": { "avg": { "field": "price" } }, "max_views": { "max": { "field": "views" } } } }4.2 桶聚合
将文档分组到不同的桶中:
{ "aggs": { "by_category": { "terms": { "field": "category.keyword" } } } }4.3 嵌套聚合
组合多种聚合方式:
{ "aggs": { "by_category": { "terms": { "field": "category.keyword" }, "aggs": { "avg_price": { "avg": { "field": "price" } } } } } }5. 常见问题与优化建议
5.1 查询性能优化
- 尽量使用filter而不是must,因为filter结果会被缓存
- 避免使用通配符查询(wildcard)
- 对经常查询的字段建立索引
5.2 映射设计建议
- 明确区分text和keyword类型字段
- 对需要排序或聚合的字段使用keyword类型
- 合理使用copy_to合并多个字段
5.3 调试技巧
- 使用explain参数查看评分详情
- 通过profile分析查询性能瓶颈
- 在Kibana的Dev Tools中测试查询
我在实际项目中总结的经验是:ES查询语法虽然强大,但也要注意不要过度使用复杂查询。简单的查询组合往往能达到更好的性能和可维护性。对于新手来说,建议先从bool查询和term/match查询开始掌握,再逐步学习更高级的聚合和嵌套查询。