
1. Elasticsearch基础查询语法入门指南作为一款分布式搜索和分析引擎Elasticsearch简称ES的查询语法是每个开发者必须掌握的核心技能。我在实际项目中使用ES已有5年多时间今天就来分享最实用的基础查询语法帮你快速上手这个强大的工具。ES查询主要分为两类简单查询如term、match和复合查询如bool。理解这些基础语法后你就能处理80%的日常搜索需求。下面我会用实际案例演示最常见的几种查询方式。2. 基础查询类型详解2.1 精确查询term与termsterm查询用于精确匹配某个字段的值不会对查询文本进行分词处理。这在搜索ID、状态码等字段时特别有用{ query: { term: { status: { value: published } } } }如果需要同时匹配多个值可以使用terms查询{ query: { terms: { tags: [python, database] } } }注意term查询对大小写敏感且要求字段类型为keyword。如果字段是text类型建议改用match查询。2.2 全文检索match与multi_matchmatch查询会对查询文本进行分词处理适合搜索文章内容等文本字段{ query: { match: { content: Elasticsearch基础教程 } } }multi_match则允许在多个字段中搜索相同的关键词{ query: { multi_match: { query: 搜索语法, fields: [title, content, description] } } }2.3 范围查询rangerange查询用于数值或日期范围的筛选{ 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 ] }提示深度分页如from10000会影响性能建议改用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查询开始掌握再逐步学习更高级的聚合和嵌套查询。