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.mzph.cn/web/5382.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字电路-5路呼叫显示和8路抢答器

本内容涉及两个电路,分别为5路呼叫显示电路和8路抢答器电路,包含Multisim仿真原文件,为掌握FPGA做个铺垫。紫色文字是超链接,点击自动跳转至相关博文。持续更新,原创不易! 目录: 一、5路呼叫显…

【百度Apollo】探索自动驾驶:百度Apollo视觉感知模块的实践与创新

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 引入一、百度Apollo视觉感知模块概述二、启动感知模块步骤一:进入 Docker 环境并启动 Dreamview步骤二…

HOOPS Exchange导入数据时如何使用CATIA缓存选项?

1、什么是CATIA缓存选项和CGR文件? CATIA V5默认的工作方式是加载几何图形。加载大型程序集时,这可能会导致性能下降,因为所需的内存很重要。 在这种情况下,我们可能需要使用缓存选项。这将生成仅包含曲面细分数据而不包含几何图…

Docker容器---docker-Consul部署

一、Docker-consul简介 1、概述 consul是google开源的一个使用go语言开发的服务管理软件。支持多数据中心、分布式高可用的、服务发现和配置共享。采用Raft算法,用来保证服务的高可用。内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多…

【Hadoop】-Hive客户端:HiveServer2 Beeline 与DataGrip DBeaver[14]

HiveServer2 & Beeline 一、HiveServer2服务 在启动Hive的时候,除了必备的Metastore服务外,我们前面提过有2种方式使用Hive: 方式1: bin/hive 即Hive的Shell客户端,可以直接写SQL方式2: bin/hive --…

绕过Windows 11的安装门槛

🧐 Win11安装门槛 自从Win11发布以来,微软提高了对电脑配置的要求,如TPM支持、特定CPU型号限制等,让不少小伙伴的升级之路变得坎坷。不过,俗话说得好,道高一尺魔高一丈,今天就让我们一起来看看…

大语言模型与词向量表示

大语言模型(Large Language Models, LLMs)与词向量表示之间的关系是紧密相连的。以下是几个关键点,说明了它们之间的联系: 1. 高质量词向量的生成 大语言模型能够生成高质量的词向量表示。这些模型通过在大量文本数据上的预训练学…

ES基础查询,term级参数介绍

Term级别查询 term这个单词汉语翻译是术语、条款等意思,在es中翻译过来我总感觉怪怪的。es官网将ids、term、terms、fuzzy等查询方式放在这个分类下,他们是dsl语句中最基本的语句,大都是单条件查询。其中ids、esists、range、term、terms等查…

MongoDB聚合运算符:$strLenCP

MongoDB聚合运算符&#xff1a;$strLenCP $strLenCP聚合运算符返回指定字符串中 UTF-8 代码点的数量。 语法 { $strLenCP: <string expression> }<expression>为可解析为字符串的表达式&#xff0c;如果解析为null或引用了不存在的字段&#xff0c;返回错误。 …

二,网络安全常用术语

黑客&#xff08;hacker&#xff09;——对计算机技术非常擅长的人&#xff0c;窃取数据&#xff0c;破坏计算机系统&#xff1b;全球最知名的一个黑客组织匿名&#xff08;Anonymous&#xff09;。 脚本小子——刚刚入门安全行业&#xff0c;学习了一些技术&#xff0c;只会用…

美国天然气期货价格因高库存水平和天气预报因素下跌

近期&#xff0c;美国天然气期货价格出现下跌&#xff0c;主要原因是高库存水平继续对价格形成压力。纽约商品交易所(NYMEX)的天然气期货价格收跌2.4美分&#xff0c;至每百万英热1.614美元&#xff0c;跌幅为1.5%。这一价格下跌反映了天然气市场受多种因素影响的复杂局面。 库…

完美解决AttributeError: module ‘backend_interagg‘ has no attribute ‘FigureCanvas‘

遇到这种错误通常是因为matplotlib的后端配置问题。在某些环境中&#xff0c;尤其是在某些特定的IDE或Jupyter Notebook环境中&#xff0c;可能会因为后端配置不正确而导致错误。错误信息提示 module backend_interagg has no attribute FigureCanvas 意味着当前matplotlib的后…

数智新重庆 | 推进信号升格 打造算力山城

2024年&#xff0c;是实现“十四五”规划目标任务的关键一年&#xff0c;高质量的5G网络、强大的AI能力作为新质生产力的重要组成部分&#xff0c;将有效赋能包括制造业在内的千行万业数字化化、智能化、绿色化转型升级&#xff0c;推动融合应用新业态、新模式蓬勃兴起&#xf…

【javaWeb项目】基于网页形式,通过浏览器访问的java应用程序,就称为javaweb程序

JavaWeb前端 第一章 1、javaWeb是什么 //基于网页形式&#xff0c;通过浏览器访问的java应用程序&#xff0c;就称为javaweb程序2、web程序的分类 //1、静态web程序特点&#xff1a;网页上的内容是固定不变的&#xff0c;不能动态加载&#xff0c;例如web前端//2、动态web程序…

typescript学习笔记2

交叉类型&#xff08;Intersection Types&#xff09; 交叉类型是将多个类型合并为一个类型。这通过 & 符号实现。 typescript type Combined Type1 & Type2 & Type3; 例如&#xff0c;一个对象可能同时拥有多个接口所定义的属性&#xff1a; typescript interf…

linux 搭建知识库文档系统 mm-wiki

目录 一、前言 二、常用的知识库文档工具 2.1 PingCode 2.2 语雀 2.3 Tettra 2.4 Zoho Wiki 2.5 Helpjuice 2.6 SlimWiki 2.7 Document360 2.8 MM-Wiki 2.9 其他工具补充 三、MM-Wiki 介绍 3.1 什么是MM-Wiki 3.2 MM-Wiki 特点 四、搭建MM-Wiki前置准备 4.1 前置…

【iOS】消息流程分析

文章目录 前言动态类型动态绑定动态语言消息发送objc_msgSendSEL&#xff08;selector&#xff09;IMP&#xff08;implementation&#xff09;IMP高级用法 MethodSEL、IMP、Method总结流程概述 快速查找消息发送快速查找的总结buckets 慢速查找动态方法解析resolveInstanceMet…

用 PyTorch 构建液态神经网络(LNN)

用 PyTorch 构建液态神经网络&#xff08;LNN&#xff09; 文章目录 什么是液态神经网络为什么需要液态神经网络LNN 与 RNN 的区别用 PyTorch 实现 LNNStep 1. 导入必要的库Step 2. 定义网络架构Step 3. 实现 ODE 求解器Step 4. 定义训练逻辑 LNN 的缺陷总结 什么是液态神经网络…

设计模式第二次测试 | 数据库连接池设计(原型模式、创建者模式、适配器模式)

需求中文如下&#xff1a;原本是英文&#xff0c;用百度翻译转换而来 我们需要设计一个工具&#xff0c;它负责创建一个与数据库软件MySQL的连接池。 连接池中有数百个连接可供客户端使用。 所有连接对象都有相同的内容&#xff0c;但它们是不同的对象。 连接对象的创建是资源密…

聊聊 ASP.NET Core 中间件(一):一个简单的中间件例子

前言&#xff1a;什么是中间件 服务器在收到 HTTP 请求后会对用户的请求进行一系列的处理&#xff0c;比如检查请求的身份验证信息、处理请求报文头、检查是否存在对应的服务器端响应缓存、找到和请求对应的控制器类中的操作方法等&#xff0c;当控制器类中的操作方法执行完成…