Elasticsearch索引定义

1. 前言

索引是具有相同结构的文档的集合,每个索引都拥有一个唯一的索引名称,它是ES里面非常重要的概念。一个ES集群中可以有多个索引,不同的索引代表不同的业务类型数据。

什么时候需要创建新的索引呢?一般来说有两类场景:

  • 按业务分类:比如存储新闻数据的索引news、存储日志的索引logs等。
  • 按日期范围分类:当数据量特别大时,可以根据时间范围创建索引,例如面对海量的线上日志,可以根据月份来创建日志索引:logs-202401、logs-202402等等。

索引的命名需要遵循以下约束:

  • 只能使用小写字母,不能使用大写字母
  • 不能包括 \ / * ? ” < > | ` # : 及空格等特殊符号
  • 不能以 - _ + 作为开始字符
  • 不能命名为“.”或者“…”
  • 不能超过255个字节
  • 不建议使用中文命名

2. 索引定义

在索引文档前,首先需要定义索引。包括:索引名称、索引设置、索引映射、别名、分析器等。
如下示例,我们创建了一个名称为“student”的索引,它拥有1个分片数和1个副本数;在索引映射里我们定义了三个字段分别是:学号 student_id、姓名 name、性别 gender,字段类型都是keyword,用于精准匹配;同时该索引还有一个别名:student_alias。

PUT student
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "student_id": {
        "type": "keyword"
      },
      "name": {
        "type": "keyword"
      },
      "gender": {
        "type": "keyword"
      }
    }
  },
  "aliases": {
    "student_alias": {}
  }
}

2.1 索引设置

索引设置可以分为两大类:静态设置和动态设置。

静态设置:只允许在创建索引时或者针对已关闭的索引进行设置,例如:

  • index.number_of_shards:索引拥有的主分片数,默认值为1,上限是1024,创建后不能修改
  • index.codec:索引压缩算法,默认使用LZ4算法,可以指定best_compression 以获得更高的压缩比

动态设置:可以借助更新设置API的方式进行动态更新,更新后立即生效,例如:

  • index.number_of_replicas:主分片拥有的副本分片数
  • index.refresh_interval:refresh操作的频率,决定了文档写入后多久可以被搜索到,默认1s
  • index.max_result_window:搜索结果的窗口大小,默认值10000,调大该值可能会影响ES性能

2.2 索引映射

索引映射可以理解为数据库表结构Schema,通过index.mappings 属性设置。索引映射的内容包含:字段名称、字段类型、分析器的定义(针对text类型)、fielddata、doc_values等设置。
如下示例,定义“news”索引用来存放新闻数据,标题title数据类型是text,使用「ik_max_word」分词器、内容content数据类型也是text,使用「ik_smart」分词器。

PUT news
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "content": {
        "type": "text",
        "analyzer": "ik_smart"
      }
    }
  }
}

2.3 索引别名

索引创建后,索引名称就不支持修改了,但是可以通过设置别名来满足不同的业务,ES的大部分API都可以通过索引别名来调用。

比如,面对线上海量的日志数据,一般会根据日志的时间写入到不同的索引,比如按年、按月、甚至按天来创建索引,但是对外提供的检索服务一般会按照相对时间来查询日志,比如查询近一个月的日志,此时程序要查询的索引名称会随着时间不断变化,我们就可以创建一个索引别名“logs_last_month”来指向最近一个月的所有索引。
如下示例,索引别名“logs_last_month”从"logs_202402" 指向了 “logs_202403”。

POST _aliases
{
  "actions": [
    {
      "remove": {
        "index": "logs_202402",
        "alias": "logs_last_month"
      }
    },
    {
      "add": {
        "index": "logs_202403",
        "alias": "logs_last_month"
      }
    }
  ]
}

2.4 索引模板

索引模板是一种告诉Elasticsearch在创建索引时如何配置索引的方法。

试想这样一个场景,面对线上海量的日志,需要按照月份来创建多个日志索引,如何保证日志索引之间的配置是一样的呢?即拥有相同的settings、mappings等配置。
使用相同的配置来创建索引固然是一种方案,但是太繁琐了,索引模板应运而生。
Elasticsearch7.8版本之后开始支持两种索引模板类型:普通索引模板和组件索引模板。

2.4.1 普通索引模板

普通索引模板就是预先创建好的一个完整的索引模板,ES在创建索引时,如果发现可以匹配到索引模板,就会采用模板设置。
如下命令会创建一个普通索引模板,它会匹配”logs-*“的索引名称,索引映射字段和数据类型都已指定。

PUT _index_template/logs_template
{
  "index_patterns": [
    "logs-*"
  ],
  "template": {
    "mappings": {
      "properties": {
        "trace_id": {
          "type": "keyword"
        },
        "content": {
          "type": "text"
        },
        "time": {
          "type": "date"
        }
      }
    }
  }
}

现在我们创建一个”logs-2024“索引,会发现它成功应用到了上述模板的配置。

PUT logs-2024
GET logs-2024

{
  "logs-2024": {
    "aliases": {},
    "mappings": {
      "properties": {
        "content": {
          "type": "text"
        },
        "time": {
          "type": "date"
        },
        "trace_id": {
          "type": "keyword"
        }
      }
    }
    ......
  }
}

2.4.2 组件索引模板

组件模板的核心在于将原有普通模板定义的mappings、settings等配置以组件的方式分隔,以便最小化更新模板。

如下示例,定义settings组件:主分片数和副本分片数均为1,refresh时间间隔是5s,采用best_compression压缩方式

PUT _component_template/mylogs-settings
{
  "template": {
    "settings": {
      "number_of_shards": 1,
      "number_of_replicas": 1,
      "refresh_interval": "5s",
      "codec": "best_compression"
    }
  }
}

如下示例,定义mappings组件,包含三个字段

PUT _component_template/mylogs-mappings
{
  "template": {
    "mappings": {
      "properties": {
        "trace_id": {
          "type": "keyword"
        },
        "content": {
          "type": "text"
        },
        "time": {
          "type": "date"
        }
      }
    }
  }
}

最后就是基于组件模板来定义索引模板,如下示例,效果和直接定义普通索引模板是一样的

PUT _index_template/logs-template-for-components
{
  "index_patterns": [
    "logs-*"
  ],
  "priority": 10, 
  "composed_of": [
    "mylogs-settings",
    "mylogs-mappings"
  ]
}

2.4.3 动态模板

动态模板允许我们更好地控制ES如何在默认的动态字段映射规则之外映射数据。通过将index.mappings.dynamic 设置为true或runtime,可以启用动态映射,当我们索引一个原先不存在的字段时,ES会动态的新增映射字段。但是有些时候,ES动态映射规则不是很理想,例如ES会把整型默认映射为long类型,占用8个字节,如果我们不需要这么大的范围就很浪费空间,就可以通过动态模板来调整ES的映射规则。

ES动态模板支持的匹配条件:

  • match_mapping_type | unmatch_mapping_type:匹配或没匹配到指定的数据类型
  • match | unmatch:模式匹配或没匹配到指定的字段名称
  • path_match | path_unmatch:匹配或没匹配到字段的路径

如下示例,创建了一个动态模板,第一条规则是把string类型且以"ip"结尾的字段映射为ip类型;第二条规则是把string类型且以"_date"结尾的字段映射为date类型。

PUT _index_template/my-dynamic-template
{
  "index_patterns": [
    "index-dynamic-*"
  ],
  "template": {
    "mappings": {
      "dynamic_templates": [
        {
          "string_as_ip": {
            "match_mapping_type": "string",
            "match": "*ip",
            "mapping": {
              "type": "ip"
            }
          }
        },
        {
          "string_as_date": {
            "match_mapping_type": "string",
            "match": "*_date",
            "mapping": {
              "type": "date"
            }
          }
        }
      ]
    }
  }
}

我们创建一个索引,让它能应用到动态模板。接着往里面索引一个文档,查看索引映射,发现字段数据类型符合预期。

PUT index-dynamic-01
POST index-dynamic-01/_doc
{
  "node-ip":"127.0.0.1",
  "create_date":"2024-01-01T00:00:00"
}

GET index-dynamic-01
{
  "index-dynamic-01": {
    "mappings": {
      "properties": {
        "create_date": {
          "type": "date"
        },
        "node-ip": {
          "type": "ip"
        }
      }
    }
  }
}

但是,如果索引一个非法的文档,例如字符串不是日期格式的,ES就会报错:

POST index-dynamic-01/_doc
{
  "xx_date":"haha"
}

{
  "error": {
    "root_cause": [
      {
        "type": "document_parsing_exception",
        "reason": "[2:13] failed to parse field [xx_date] of type [date] in document with id '1-trmI4BODFb3LbQXXSd'. Preview of field's value: 'haha'"
      }
    ],
    "type": "document_parsing_exception",
    "reason": "[2:13] failed to parse field [xx_date] of type [date] in document with id '1-trmI4BODFb3LbQXXSd'. Preview of field's value: 'haha'",
    "caused_by": {
      "type": "illegal_argument_exception",
      "reason": "failed to parse date field [haha] with format [strict_date_optional_time||epoch_millis]",
      "caused_by": {
        "type": "date_time_parse_exception",
        "reason": "Failed to parse with all enclosed parsers"
      }
    }
  },
  "status": 400
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/585875.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mac/windows下安装docker,minikube

1、安装docker Get Started | Docker 下载安装docker 就行 启动后,就可以正常操作docker了 使用docker -v 验证是否成功就行 2、安装minikube,是基于docker-desktop的 2.1、点击设置 2.2、选中安装,这个可能需要一点时间 这样安装后&…

OPC UA与IEC61499 在分布式智能电网中的应用

储能系统的系统架构 CMC :Cell Management Controller 储能设备中的电池芯包与电池均衡系统构成电池模组,国内的电池芯包通常使用被动均衡技术,被动均衡芯片通常通过SPI 接口连接到CMC 控制器,CMC 以单片机为主构建,具…

MySQL基础学习(待整理)

MySQL 简介 学习路径 MySQL 安装 卸载预安装的mariadb rpm -qa | grep mariadb rpm -e --nodeps mariadb-libs安装网络工具 yum -y install net-tools yum -y install libaio下载rpm-bundle.tar安装包,并解压,使用rpm进行安装 rpm -ivh \ mysql-communi…

WordPress Automatic插件 SQL注入漏洞复现(CVE-2024-27956)

0x01 产品简介 WordPress Automatic(又称为WP Automatic)是一款流行的WordPress插件,旨在帮助网站管理员自动化内容创建和发布。该插件可以从各种来源(如RSS Feeds、社交媒体、视频网站、新闻网站等)获取内容,并将其自动发布到WordPress网站。 0x02 漏洞概述 WordPres…

汽车制造业安全事故频发,如何才能安全进行设计图纸文件外发?

汽车制造业产业链长,关联度高,汽车制造上游行业主要为钢铁、化工等行业,下游主要为个人消 费、基建、客运和军事等。在汽车制造的整个生命周期中,企业与上下游供应商、合作商之间有频繁、密切的数据交换,企业需要将设计…

LangChain入门2 RAG详解

RAG概述 一个典型的RAG应用程序,它有两个主要组件: 索引:从源中获取数据并对其进行索引的管道。这通常在脱机情况下发生。检索和生成:在运行时接受用户查询,并从索引中检索相关数据,然后将其传递给模型。 从原始数据…

Leetcode——面试题02.04.分割链表

面试题 02.04. 分割链表 - 力扣(LeetCode) 对于该链表OJ,我们两种大的方向: 1.在原链表上修改;2.创建新链表,遍历原链表。 在原链上进行修改:如果该节点的val小于x则继续往后走,如…

用于复杂任务的 AI 编码引擎:多文件多步骤拆解实现 | 开源日报 No.239

plandex-ai/plandex Stars: 3.1k License: AGPL-3.0 plandex 是一个用于复杂任务的 AI 编码引擎。 使用长时间运行的代理完成跨多个文件且需要多个步骤的任务将大型任务分解为较小子任务,逐一实现,直至完成整个工作帮助处理积压工作、使用陌生技术、摆…

如何在Spring Boot中配置数据库密码加密

如何在Spring Boot中配置数据库密码加密? alibaba/druid Wiki GitHub 使用ConfigFilter alibaba/druid Wiki GitHub 巧用Druid数据源实现数据库连接密码的加密解密功能 import com.alibaba.druid.filter.config.ConfigTools;public class Testttt {public stat…

后端方案设计文档结构模板可参考

文章目录 1 方案设计文档整体结构2 方案详细设计2.1 概要设计2.2 详细设计方案2.2.1 需求分析2.2.2 业务流程设计2.2.3 抽象类:实体对象建模2.2.4 接口设计2.2.5 存储设计 1 方案设计文档整体结构 一,现状:把项目的基本情况和背景都说清楚&a…

Grafana 添加一台管理服务器

1、修改prometheus.yml 添加新服务器信息 2、重启pro 3、导入node文件 4、启动node 5、检验数据

Vue3(管理系统)-封装axios(utils)

一、在utils下编写request.js实例 1.添加基地址,设置超时时间 import axios from axios const baseURL http://big-event-vue-api-t.itheima.net const instance axios.create({// TODO 1. 基础地址,超时时间baseURL,timeout: 3000 }) 2.添加请求拦截…

在Ubuntu linux操作系统上操作MySQL数据库常用的命令

检查是否安装了MySQL,或检查MySQL的状态: sudo systemctl status mysql或 sudo systemctl status mysql.service如果mysql有安装,上面这条命令会返回mysql的状态active或inactive。 卸载mysql数据库 第一步是停了数据库: sud…

【SQL Server】入门教程-基础篇(三)

目录 前言 SQL 常用函数学习 AVG – 平均值 COUNT – 汇总函数 ​编辑MAX – 最大值 ​编辑MIN – 最小值 ​编辑SUM – 求和 UCASE/UPPER – 大写 LCASE/LOWER – 小写 ROUND – 数值取舍 NOW/SYSDATE – 当前时间 前言 这一篇博客,是Sql Server函数学…

Spring MVC入门程序

SpringMVC入门程序 一、实现思路 掌握Spring MVC入门程序,能够实现入门程序的编写 二、编码实现 1、新建项目 项目:maven,原型:maven-archetype-webapp,GroupID:com.sw 引入pom依赖 2、补充项目目录 src…

# 从浅入深 学习 SpringCloud 微服务架构(七)Hystrix(3)

从浅入深 学习 SpringCloud 微服务架构(七)Hystrix(3) 一、hystrix:通过 Actuator 获取 hystrix 的监控数据 1、Hystrix 的监控平台介绍: 1)Hystrix 除了实现容错功能,Hystrix 还…

vue3中使用crypto-js库进行加密/解密

使用crypto-js库进行加密/解密 安装 npm install crypto-js 基本使用 <template><div>使用crypto-js库进行加密/解密</div> </template><script setup> import CryptoJS from crypto-js; import { onMounted } from vue;// 加密函数 const encr…

监视器和显示器的区别,普通硬盘和监控硬盘的区别

监视器与显示器的区别&#xff0c;你真的知道吗&#xff1f; 中小型视频监控系统中&#xff0c;显示系统是最能展现效果的一个重要环节&#xff0c;显示系统的优劣将直接影响视频监控系统的用户体验满意度。 中小型视频监控系统中&#xff0c;显示系统是最能展现效果的一个重要…

UDP!!!

UDP!!! 一 : 传输层的协议:二 : UDP2.1 UDP长度2.2 UDP校验和2.2.1 : 为什么会出现传输出错的情况??2.2.3: 对数据进行校验的方式CRCmd5 三 : UDP的适用场景 一 : 传输层的协议: 传输层的协议有UDP,TCP UDP:无连接,不可靠传输,面向数据报,全双工 TCP:有连接,可靠传输,面向字…

深度学习之基于YOLOv5烟花燃放智能检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 在庆祝和特殊节日中&#xff0c;烟花燃放作为传统的庆祝方式之一&#xff0c;深受人们的喜爱。…
最新文章