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