0%

Elasticsearch 索引模板:标准化索引配置与映射的利器

索引模板(Index Template)是 Elasticsearch 中用于预定义索引配置(settings)和映射(mapping)的工具。通过模板,可确保新创建的索引自动应用统一的配置,避免重复劳动并保证索引结构的一致性,尤其适合按时间分片的索引(如日志索引 log-2024-08)。

索引模板的核心作用

  • 标准化配置:为一类索引(如所有日志索引)统一设置分片数、副本数、刷新间隔等参数。
  • 预定义映射:提前定义字段类型、分词器等映射规则,避免动态映射导致的字段类型错误。
  • 自动化应用:新索引创建时,若名称匹配模板的 index_patterns,自动应用模板配置。

索引模板的基本操作

创建索引模板

通过 PUT _template/<模板名称> 创建模板,核心参数包括:

  • index_patterns:匹配索引名称的模式(支持通配符 *)。
  • order:模板优先级(数值越大优先级越高,冲突时覆盖低优先级配置)。
  • settings:索引的配置参数(如分片数、副本数)。
  • mappings:索引的字段映射规则。

示例:创建一个适用于所有日志索引的模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PUT _template/template_logs
{
"index_patterns": ["log-*"], // 匹配所有以log-开头的索引
"order": 1, // 优先级为1(可用于覆盖低优先级模板)
"settings": {
"number_of_shards": 3, // 主分片数3
"number_of_replicas": 1, // 副本数1
"refresh_interval": "30s" // 刷新间隔30秒(降低实时性,提升写入性能)
},
"mappings": {
"default": { // 6.x支持type,7.x后默认_type为_doc
"properties": {
"timestamp": { "type": "date" }, // 时间字段
"level": { "type": "keyword" }, // 日志级别(精确匹配)
"message": { "type": "text", "analyzer": "ik_max_word" } // 日志内容(中文分词)
}
}
}
}
阅读全文 »

Elasticsearch 连接查询:嵌套查询与父子查询详解

在 Elasticsearch 中,处理关联数据(如一对多关系)时,传统的对象类型(object)会因内部扁平化存储导致查询异常。为此,ES 提供了两种专门的关联查询方式:嵌套查询(nested query)父子查询(parent-child query),分别适用于不同的业务场景。

对象类型的局限性:为何需要连接查询?

对象类型(object)用于存储 JSON 对象数组,但 ES 会在内部将其扁平化处理,导致对象边界丢失,从而引发查询逻辑错误。

问题示例

假设有一篇包含多个事件的文档:

1
2
3
4
5
6
7
8
{
"name": "技术大会",
"events": [
{ "date": "2022-10-10", "title": "java架构大会" },
{ "date": "2022-08-08", "title": "hadoop大会" },
{ "date": "2022-02-02", "title": "elasticsearch大会" }
]
}

ES 内部会将其扁平化为:

1
2
3
4
5
{
"name": "技术大会",
"events.date": ["2022-10-10", "2022-08-08", "2022-02-02"],
"events.title": ["java架构大会", "hadoop大会", "elasticsearch大会"]
}
阅读全文 »

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 // 分片分配成功
}

查看索引

  • 查看单个索引:

阅读全文 »