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. 精确匹配陷阱

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

  2. 性能优化

bash 复制代码
"bool": {
  "filter": [   // 不参与评分的条件放filter
    {"range": {"created_at": {"gte": "now-30d/d"}}}
  ]
}
  1. 深度分页问题
     避免使用from+size处理超过10,000条的结果集,改用search_afterscrollAPI
  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入门:全文搜索实战》

相关推荐
小牛头#2 小时前
clickhouse 各个引擎适用的场景
大数据·clickhouse·机器学习
lifallen4 小时前
Paimon LSM Tree Compaction 策略
java·大数据·数据结构·数据库·算法·lsm-tree
元宇宙时间4 小时前
全球发展币GDEV:从中国出发,走向全球的数字发展合作蓝图
大数据·人工智能·去中心化·区块链
hdsoft_huge4 小时前
SpringBoot 与 JPA 整合全解析:架构优势、应用场景、集成指南与最佳实践
java·spring boot·架构
慕木兮人可7 小时前
Docker部署MySQL镜像
spring boot·后端·mysql·docker·ecs服务器
isNotNullX8 小时前
数据中台架构解析:湖仓一体的实战设计
java·大数据·数据库·架构·spark
苦学编程的谢10 小时前
SpringBoot项目的创建
java·spring boot·intellij-idea
武昌库里写JAVA10 小时前
vue3面试题(个人笔记)
java·vue.js·spring boot·学习·课程设计
数据库安全11 小时前
首批|美创智能数据安全分类分级平台获CCIA“网络安全新产品”
大数据·人工智能·web安全