0%

Elasticsearch 系统状态查询:使用 Cat APIs 监控集群

Elasticsearch 提供了一系列 cat APIs(基于 HTTP 的 REST 接口),以简洁的文本格式展示集群、索引、节点等核心组件的状态信息,便于开发者和运维人员快速监控系统运行情况。这些 API 输出格式直观(类似命令行工具),支持通过参数筛选和格式化输出。

Cat APIs 核心特点

  • 轻量高效:返回纯文本或表格格式,数据量小,适合快速查看。
  • 易于解析:支持 v 参数显示表头,h 参数筛选字段,便于脚本处理。
  • 覆盖全面:涵盖集群健康、节点状态、索引信息、分片分配等核心指标。

常用 Cat APIs 详解

集群健康状态:_cat/health

展示集群的整体健康状态(绿色 / 黄色 / 红色)、节点数量、分片状态等。

1
GET _cat/health?v

输出示例:

1
2
epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1690000000 12:00:00 elasticsearch green 3 2 10 5 0 0 0 0 - 100.0%

字段说明:

  • status:集群健康状态(green/yellow/red)。
  • node.total:总节点数;node.data:数据节点数。
  • shards:总分片数;pri:主分片数;unassign:未分配分片数。

节点信息:_cat/nodes

展示所有节点的基本信息,包括内存占用、CPU 负载、角色等。

阅读全文 »

Elasticsearch 复杂查询详解:复合查询与逻辑组合

在 Elasticsearch 中,复杂查询通过组合多个简单查询条件,实现精准的数据过滤和相关性排序。核心复合查询包括 bool(布尔逻辑)、dis_max(取最大值)和 boosting(评分调整)等,适用于多条件组合、多字段匹配等场景。

bool 查询:布尔逻辑组合

bool 查询是最常用的复合查询,通过 mustfiltershouldmust_not 四个子句组合多个查询条件,实现类似 ANDORNOT 的逻辑关系。

核心子句说明

子句 作用 是否影响评分 类比逻辑
must 必须匹配的条件(所有条件都满足) AND
filter 必须匹配的条件(与 must 功能相同,但不参与评分) AND
should 可选匹配的条件(至少满足一个,除非有 must/filter 子句) OR
must_not 必须不匹配的条件(排除符合条件的文档) NOT

配置参数

  • minimum_should_match:指定 should 子句中至少需要匹配的条件数量(默认:当存在 must/filter 时为 0,否则为 1)。
  • boost:为整个 bool 查询设置权重(默认 1.0)。

示例:多条件组合查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
GET products/_search
{
"query": {
"bool": {
"must": [ // 必须满足的条件(影响评分)
{ "match": { "name": "手机" } }, // 名称包含“手机”
{ "range": { "price": { "gte": 1000 } } } // 价格≥1000
],
"filter": [ // 必须满足的条件(不影响评分,可缓存)
{ "term": { "brand.keyword": "华为" } }, // 品牌是华为(精确匹配)
{ "range": { "stock": { "gt": 0 } } } // 库存>0
],
"should": [ // 可选条件(满足得高分)
{ "term": { "tags.keyword": "新品" } }, // 标签包含“新品”
{ "term": { "tags.keyword": "促销" } } // 标签包含“促销”
],
"must_not": [ // 必须不满足的条件
{ "term": { "type.keyword": "二手" } } // 排除二手商品
],
"minimum_should_match": 1 // 至少满足1个should条件
}
}
}

关键特性

阅读全文 »

Elasticsearch 索引管理详解:创建、配置与维护

索引是 Elasticsearch 中存储和检索数据的基本单元,类似于关系数据库中的 “表”。合理的索引管理(创建、配置、维护)直接影响查询性能和数据可靠性。以下基于 6.8.x 版本,详细介绍索引的核心操作。

索引的创建与基础操作

新建索引

使用 PUT 请求创建空索引,默认配置为 5 个主分片和 1 个副本分片。

1
PUT blog  // 创建名为blog的索引

响应示例(成功):

1
2
3
4
{
"acknowledged": true, // 索引创建成功
"shards_acknowledged": true // 分片分配成功
}

查看索引

  • 查看单个索引:

阅读全文 »

Elasticsearch 映射参数详解:定制字段的索引与检索行为

映射参数(Mapping Parameters)是 Elasticsearch 中用于定制字段行为的核心配置,通过这些参数可以控制字段的分词方式、数据处理、索引策略等,以适配不同的业务场景。以下是 6.8.x 版本中常用映射参数的详细解析。

analyzer:字符串分词器配置

analyzer 用于指定索引时处理字符串字段的分词器,决定如何将文本拆分为词项(Term)。查询时的分词器由 search_analyzer 或默认规则决定。

核心作用

  • 定义字符串字段的分词逻辑(如中文分词、英文词干提取等)。
  • 支持预定义分析器(如 standardik_smart)或自定义分析器。

分析器查找顺序

  • 索引时:字段映射中定义的 analyzer → 索引设置中的 default 分析器 → 标准分析器(standard)。
  • 查询时:查询中指定的 analyzer → 字段映射的 search_analyzer → 字段映射的 analyzer → 索引设置的 default_search → 索引设置的 default → 标准分析器。

配置示例(自定义分析器)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": { // 自定义索引时分析器
"type": "custom",
"tokenizer": "standard", // 标准分词器
"filter": ["lowercase"] // 转小写过滤器
},
"my_search_analyzer": { // 自定义查询时分析器
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase", "stop"] // 额外添加停止词过滤
}
}
}
},
"mappings": {
"default": {
"properties": {
"title": {
"type": "text",
"analyzer": "my_analyzer", // 索引时用自定义分析器
"search_analyzer": "my_search_analyzer" // 查询时用另一分析器
}
}
}
}
}

注意

  • 文本字段(text)必须配置分析器,关键词字段(keyword)不分词,无需指定。
  • 中文分词需依赖第三方插件(如 IK 分词器),并在 analyzer 中指定(如 ik_max_word)。

normalizer:关键词标准化器

normalizer 仅用于 keyword 类型字段,在索引前对字段值进行标准化处理(如大小写转换、特殊字符处理),确保精确匹配的一致性。

阅读全文 »

Elasticsearch 映射中的元字段:内置字段的作用与用法

在 Elasticsearch 中,元字段(Meta-fields)是索引文档时自动生成或可配置的内置字段,用于描述文档的元数据(如 ID、索引名)或控制文档的处理逻辑(如路由、存储)。这些字段是 Elasticsearch 内部机制的重要组成部分,理解它们的作用有助于优化查询性能和数据管理。

_all 字段:全局全文搜索字段

_all 字段是一个特殊的 “聚合字段”,它会将文档中所有字段的文本内容合并为一个大字符串,用于在不知道具体字段名的情况下进行全文搜索。

特性

  • 默认情况下,_all 字段会包含所有 textkeyword 类型字段的值(数字、日期等类型需显式配置才会被包含)。
  • 6.0 版本后默认禁用,需手动开启。

配置与使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 创建索引时开启 _all 字段
PUT my_index
{
"mappings": {
"default": {
"_all": { "enabled": true }, // 开启 _all 字段
"properties": {
"name": { "type": "text" },
"age": { "type": "integer", "include_in_all": true } // 强制将数字字段包含到 _all
}
}
}
}

// 使用 _all 字段搜索(匹配 name 或 age 中包含相关值的文档)
GET my_index/_search
{
"query": {
"match": { "_all": "john 30" } // 无需指定具体字段,搜索所有字段
}
}

注意

  • _all 字段会增加索引存储和写入开销,仅在需要 “全局搜索” 场景下使用。
  • 可通过 include_in_all: false 排除特定字段(如敏感信息)。

_field_names 字段:非空字段跟踪

_field_names 字段记录文档中所有非空字段的名称,用于快速查询 “包含特定字段” 或 “包含任意非空字段” 的文档。

特性

  • 自动索引文档中所有非空字段的名称,无需手动配置。
  • 可通过 enabled: false 禁用(节省存储)。

配置与使用

阅读全文 »