Elasticsearch RESTful API入门:基础搜索与查询DSL

Elasticsearch RESTful API入门:基础搜索与查询DSL

本文为Elasticsearch初学者详细解析RESTful API的核心操作与查询DSL语法,包含大量实战示例及最佳实践。

一、Elasticsearch与RESTful API简介

Elasticsearch(ES)作为分布式搜索分析引擎,其RESTful API是与集群交互的核心方式。通过HTTP协议实现:

  • ✅ 索引文档的CRUD操作
  • ✅ 执行复杂的搜索查询
  • ✅ 获取集群健康状况
  • ✅ 管理索引生命周期

核心概念速览:

概念 说明 类比关系型数据库
索引(Index) 文档的集合 数据库的表
文档(Document) JSON格式的基本数据单元 表中的一行记录
分片(Shard) 索引的水平分割单元 表分区
映射(Mapping) 定义文档字段及类型 表结构定义

二、基础API操作实战

1. 索引管理

bash 复制代码
# 创建索引
PUT /products
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "name": {"type": "text"},
      "price": {"type": "float"},
      "category": {"type": "keyword"},
      "created_at": {"type": "date"}
    }
  }
}

# 删除索引 (谨慎操作!)
DELETE /products

### 2. 文档操作

```bash
# 添加文档
POST /products/_doc/1001
{
  "name": "无线蓝牙耳机",
  "price": 299.0,
  "category": "电子产品",
  "created_at": "2023-05-10"
}

# 获取文档
GET /products/_doc/1001

# 更新文档
POST /products/_update/1001
{
  "doc": {
    "price": 259.0
  }
}

# 删除文档
DELETE /products/_doc/1001

三、搜索API核心机制

1. 搜索端点

所有搜索请求发送到_search端点:

bash 复制代码
GET /products/_search

2. 两种查询方式对比

方式 语法示例 适用场景
URL参数查询 ?q=category:电子产品 快速简单查询
DSL请求体查询 JSON结构描述复杂查询逻辑 生产环境推荐使用

四、查询DSL深度解析

1. 全文搜索 - match查询

bash 复制代码
GET /products/_search
{
  "query": {
    "match": {
      "name": {
        "query": "降噪耳机",
        "operator": "and"
      }
    }
  }
}
  • 对文本 分词处理 ( "降噪耳机" → "降噪","耳机")

  • operator参数:and(必须全部包含) 或 or(包含任意词)

2. 精确匹配 - term查询

bash 复制代码
GET /products/_search
{
  "query": {
    "term": {
      "category.keyword": {
        "value": "电子产品"
      }
    }
  }
}
  • 注意使用.keyword子字段进行未分词的精确匹配

  • 适用于状态、标签等离散值字段

3. 范围查询 - range

bash 复制代码
GET /products/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 200,
        "lte": 500
      }
    }
  }
}
  • 支持操作符:gt(>), gte(>=), lt(<), lte(<=)

  • 适用于数值、日期范围过滤

4. 布尔组合 - bool查询

bash 复制代码
GET /products/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {"name": "耳机"}}
      ],
      "should": [
        {"term": {"category.keyword": "促销品"}},
        {"range": {"price": {"lte": 199}}}
      ],
      "must_not": [
        {"term": {"brand.keyword": "A品牌"}}
      ],
      "filter": [
        {"term": {"in_stock": true}}
      ],
      "minimum_should_match": 1
    }
  }
}
子句 作用 是否影响相关性评分
must 必须满足,相当于AND 是
should 应该满足,相当于OR 是
must_not 必须不满足,相当于NOT 否
filter 必须满足,但不参与评分 否

5. 短语搜索 - match_phrase

bash 复制代码
GET /products/_search
{
  "query": {
    "match_phrase": {
      "description": {
        "query": "高清防水",
        "slop": 3
      }
    }
  }
}

-要求词语 按顺序完整出现

-slop参数允许中间间隔的词数

五、搜索结果处理技巧

1. 分页与排序

bash 复制代码
GET /products/_search
{
  "from": 10,
  "size": 5,
  "sort": [
    {"price": {"order": "asc"}},
    {"_score": {"order": "desc"}}
  ],
  "query": {...}
}

2. 字段过滤

bash 复制代码
GET /products/_search
{
  "_source": ["name", "price"],
  "query": {...}
}

3. 结果分析

典型搜索结果结构:

bash 复制代码
{
  "took": 15,                 // 查询耗时(ms)
  "timed_out": false,
  "hits": {
    "total": {
      "value": 42,            // 匹配总数
      "relation": "eq"
    },
    "max_score": 1.234,       // 最高得分
    "hits": [                 // 结果数组
      {
        "_index": "products",
        "_id": "1001",
        "_score": 1.234,
        "_source": {          // 原始文档
          "name": "无线蓝牙耳机",
          "price": 299.0
        }
      }
    ]
  }
}

六、最佳实践与避坑指南

  1. 精确匹配陷阱

     字符串字段默认同时创建text和keyword类型,精确匹配需用字段名.keyword

  2. 性能优化

bash 复制代码
"bool": {
  "filter": [   // 不参与评分的条件放filter
    {"range": {"created_at": {"gte": "now-30d/d"}}}
  ]
}
  1. 深度分页问题
     避免使用from+size处理超过10,000条的结果集,改用search_after或scrollAPI
  2. 安全防护
     生产环境必须启用:

   - X-Pack安全模块

   - API密钥认证

   - 网络访问控制

七、学习资源推荐

  1. 官方文档 :Elasticsearch Reference
  2. 实战工具:
    • Kibana Dev Tools
    • Postman
    • curl命令
      附录:常用查询速查表
查询类型 用途 示例
match 全文搜索 {"match": {"title": "ES"}}
term 精确值匹配 {"term": {"status": 1}}
range 范围查询 {"range": {"age": {"gte": 18}}}
bool 组合多个查询条件 见第四节示例
match_phrase 短语搜索 {"match_phrase": {"quote": "to be or"}}

下集预告《Elasticsearch RESTful API入门:全文搜索实战》

相关推荐
俊哥大数据4 小时前
Flink 2.3.0 从理论到实践 —— 第 8 章 窗口(Window)
大数据·flink
高级程序源4 小时前
springboot荆州旅游推介平台24175-计算机课程设计、毕业设计
vue.js·spring boot·python·mysql·django·课程设计
威哥爱编程4 小时前
【AI全栈12-05】Spring Boot 用 Tool Calling 让 AI 查实时订单与库存
java·spring boot·后端
威哥爱编程4 小时前
【AI全栈12-06】Spring Boot 用 RAG 搭企业私有知识库问答
java·spring boot·后端
小蒜学长4 小时前
基于微信小程序的医院医疗废弃物追溯管理系统(代码+数据库+LW)
java·spring boot·后端·微信小程序·医疗废弃物
威哥爱编程4 小时前
【AI全栈12-04】Spring Boot 用结构化输出自动解析简历:让模型按你的 POJO 输出
java·spring boot·后端
Wx-bishekaifayuan5 小时前
springboot公考微信小程序35511-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游
计算机编程指导师5 小时前
【计算机毕设选题】基于Hadoop的全球企业邮件安全合规数据可视化分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习
大数据·hadoop·python·数据分析·毕业设计·课程设计·企业邮件
for_ever_love__5 小时前
LangChain SelfQueryRetriever:让模型自己写过滤条件
人工智能·语言模型·langchain·nlp·全文检索·元数据查询·自查询检索
计算机编程指导师5 小时前
【计算机毕设选题】基于Spark的零售交易者行为特征与生存状况数据分析系统源码 毕业设计 选题推荐 数据分析 机器学习
大数据·计算机·数据分析·spark·毕业设计·课程设计·零售