ElasticSearch 实战: ES 搜索 API

Elasticsearch 的搜索 API 是其最强大的功能之一,允许您根据各种条件高效地查找和筛选索引中的文档。以下是搜索 API 的实战指南:

1. 基本搜索请求

请求方式:GET

URLGET /<index>/_search

请求体(JSON 格式):包含搜索查询定义和其他搜索参数。

示例

GET /my_index/_search
{
  "query": {
    "match_all": {}
  }
}

此示例执行了一个简单的全量搜索,返回 my_index 中的所有文档。

2. 查询结构

搜索请求的核心是 query 部分,它支持多种查询类型。以下是一些常用的查询类型:

a. 全文搜索 (Match Query)

目的:对全文字段执行模糊匹配。

示例

{
  "query": {
    "match": {
      "title": "example search"
    }
  }
}
b. 精确匹配 (Term Query)

目的:对非全文字段执行精确值匹配。

示例

{
  "query": {
    "term": {
      "category.keyword": "electronics"
    }
  }
}
c. 范围查询 (Range Query)

目的:查找在指定数值或日期范围内匹配的文档。

示例

{
  "query": {
    "range": {
      "price": {
        "gte": 50,
        "lte": 200
      }
    }
  }
}
d. 模糊搜索与通配符查询 (Fuzzy & Wildcard Queries)

目的:执行近似匹配或模式匹配。

  • Fuzzy Query 示例:
{
  "query": {
    "fuzzy": {
      "title": {
        "value": "exmpl",
        "fuzziness": "AUTO"
      }
    }
  }
}
  • Wildcard Query 示例:
{
  "query": {
    "wildcard": {
      "product_code": {
        "value": "PRD*"
      }
    }
  }
}
e. 复合查询

目的:组合多个查询,如 bool 查询(AND、OR、NOT逻辑)、constant_score 查询、dis_max 查询等。

示例(Bool Query):

{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "example" } },
        { "range": { "price": { "gte": 100 } } }
      ],
      "should": [
        { "match": { "description": "exclusive" } },
        { "match": { "tags": "limited edition" } }
      ],
      "minimum_should_match": 1,
      "filter": [
        { "term": { "in_stock": true } }
      ]
    }
  }
}

3. 排序 (Sorting)

通过 sort 参数指定搜索结果的排序字段和方向。

示例

{
  "query": ...,
  "sort": [
    { "price": { "order": "asc" } },
    { "popularity": { "order": "desc" } }
  ]
}

4. 分页 (Pagination)

使用 fromsize 参数进行分页。

示例

{
  "query": ...,
  "from": 10,
  "size": 20
}

5. 高亮 (Highlighting)

为搜索结果中匹配的文本片段添加高亮标记。

示例

{
  "query": ...,
  "highlight": {
    "fields": {
      "title": {},
      "description": {}
    }
  }
}

6. 聚合 (Aggregations)

对搜索结果进行统计分析和数据分组。

示例(Terms Aggregation):

{
  "query": ...,
  "aggs": {
    "categories": {
      "terms": {
        "field": "category.keyword"
      }
    }
  }
}

7. 脚本字段 (Script Fields)

计算动态值并在搜索结果中返回。

示例

{
  "query": ...,
  "script_fields": {
    "discounted_price": {
      "script": {
        "source": "doc['price'].value * params.discount",
        "params": {
          "discount": 0.9
        }
      }
    }
  }
}

8. 实时性与一致性

  • 刷新 (Refresh):通过在URL中添加 ?refresh=true 参数,确保搜索结果包含最近的索引更改。

  • 一致性控制:使用 search_type 参数(如 query_then_fetchdfs_query_then_fetch)控制搜索的一致性级别。

9. 搜索模板 (Search Templates)

预定义查询模板,使用变量和条件逻辑简化复杂查询的构建。

10. 跨索引搜索与别名

  • 跨索引搜索:在URL中指定多个索引,如 GET /index1,index2/_search

  • 别名:使用别名代替索引名进行搜索,便于管理索引集合和路由。

实战中,根据实际需求灵活组合以上搜索特性,构建复杂而精准的查询语句,以高效地从Elasticsearch中检索所需数据。同时,关注性能指标,如查询速度、内存使用和磁盘I/O,适时调整查询复杂性和索引设置以优化搜索性能。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值