es-索引详解

在 Elasticsearch 中,**索引(Index)**是核心概念之一,类似于关系型数据库中的“表”。索引用于存储、组织和检索文档(Document)。以下是关于 Elasticsearch 索引的详细解析:


1. 索引的基本概念

  • 索引:一个索引是一个逻辑命名空间,用于存储具有相似结构的文档。例如,可以创建一个名为 products 的索引来存储所有产品信息。
  • 文档:文档是索引中的基本数据单元,以 JSON 格式存储。例如,一个产品文档可能包含 namepricedescription 等字段。
  • 类型(Type):在 Elasticsearch 6.x 及之前版本中,索引可以包含多个类型(类似于表)。但从 7.x 开始,类型已被弃用,每个索引只能包含一种类型(默认是 _doc)。
  • 分片(Shard):索引被划分为多个分片,分片是数据的物理存储单元。分片可以分布在不同的节点上,从而实现分布式存储和并行处理。
  • 副本(Replica):每个分片可以有多个副本,用于提高数据的可用性和容错性。

2. 索引的创建

es 支持动态映射(自动推断字段类型)和显式映射(手动定义字段类型)。

显式创建

PUT /products   
{"settings": {"number_of_shards": 3,"number_of_replicas": 2},"mappings": {"properties": {"name": { "type": "text" },"price": { "type": "float" },"description": { "type": "text", "analyzer": "english" },"extra": {"type": "text","index": false},"number" : {"type" : "keyword","null_value": "NULL"}}}   
}
  • 该索引名为 products,包含 3 个分片和 2 个副本。
  • 定义了5个字段:name(文本类型)、price(浮点类型)、description(文本类型,使用英文分词器)、extra(文本类型,不创建倒排索引)、number(keyword类型,通过NULL可筛选出没有手机号的文档)

筛选出number为空的文档

GET products/_search
{"query": {"match": {"number":"NULL"}}
}

动态创建(不建议)

POST /products/_doc/1   
{"name": "Laptop","price": 999.99,"description": "A powerful laptop for professionals."
}
  • Elasticsearch 会自动推断字段类型:name 和 description 为文本类型,price 为浮点类型。

动态创建的类型,与实际需要的类型可能不一致,不建议使用


3. 索引维护

查看索引

GET /products

删除索引

DELETE /products

4.索引的性能优化

  • 合理设置分片数量:分片数量过多会增加集群负担,过少会影响查询性能。
  • 使用副本提高可用性:副本可以提高数据的可用性和查询性能。
  • 优化映射:避免使用不必要的字段类型(如 keyword 用于大文本)。
  • 定期清理旧数据:使用索引生命周期管理(ILM)自动删除或归档旧数据

避免排序

将term、match转换成filter

使用score计算分数

GET /my_index/_search   
{"query": {"bool": {"must": [{ "term": { "status": "active" } },{ "match": { "description": "powerful laptop" } }]}}   
}

转换成不需要score计算分数

GET /my_index/_search   
{"query": {"bool": {"filter": [{ "term": { "status": "active" } },{ "match": { "description": "powerful laptop" } }]}}      
}      

优化排序与聚合

eager_global_ordinals 可以加速 排序、聚合

原理:global_ordinals全局序数是一种将字段值映射为连续整数的机制。例如,字段值 ["apple", "banana", "cherry"] 可能被映射为 [0, 1, 2]

默认情况下,全局序数是在查询时动态生成的。这意味着每次执行聚合或排序操作时,Elasticsearch 都需要遍历字段值并生成全局序数。

对于高基数字段(字段值种类多),生成全局序数可能会消耗大量时间和资源。

启用 eager_global_ordinals 时,Elasticsearch 会在索引刷新(Refresh)或段合并(Segment Merge)时预先生成全局序数

适用场景

  • 高基数字段
  • 频繁聚合或排序
  • 实时性要求高

缺点

  • 增加索引开销:在索引刷新或段合并时生成全局序数会增加 CPU 和内存开销。
  • 占用更多内存:全局序数需要存储在内存中,可能会增加内存使用量

启用eager_global_ordinals 

PUT /my_index   
{"mappings": {"properties": {"my_field": {"type": "keyword","eager_global_ordinals": true}}}   
}

避免不必要的字段类型

字段不创建索引

PUT /my_index   
{"mappings": {"properties": {"name": {"type": "text"},"metadata": {"type": "object","enabled": false},"description": {"type": "text","index": false}}}   
}

name 字段:正常索引,可以用于搜索。

metadata 字段:禁用整个对象的索引功能。

description 字段:禁用索引,无法用于搜索。

禁用索引后的字段特性

无法搜索:禁用索引的字段无法用于查询(如 matchterm 等)。

可以存储:字段的值仍然会存储在 _source 中,可以通过 _source 获取。

可以用于聚合:禁用索引的字段仍然可以用于聚合操作(如 termssum 等),性能会降低。

可以用于脚本:字段的值可以在脚本中使用。

禁用索引的适用场景

日志数据:某些字段(如原始日志)可能不需要搜索,但需要存储。

大文本字段:某些大文本字段(如文章内容)可能不需要搜索,但需要存储。

敏感数据:某些敏感数据(如密码、密钥)不需要索引,但需要存储。

注意事项

无法恢复索引:如果需要重新启用索引,必须重新创建索引或使用 reindex 

存储开销:禁用索引的字段仍然会占用存储空间,因为其值存储在 _source 中。

聚合性能:禁用索引的字段在聚合时可能会影响性能,因为需要从 _source 中提取数据。

不使用fielddata

索引的生命周期管理(ILM)

创建策略

PUT _ilm/policy/my_custom_policy   
{"policy": {"phases": {"hot": {"actions": {"rollover": {"max_size": "50GB","max_age": "30d"}}},"delete": {"min_age": "90d","actions": {"delete": {}}}}}
}

该策略定义了索引的生命周期:在 hot 阶段,当索引大小超过 50GB 或创建时间超过 30 天时,滚动到新索引;在 delete 阶段,当索引创建时间超过 90 天时,删除索引。

(场景:删除3年之前的数据)

 将策略绑定到索引

PUT /my_index   
{"settings": {"index.lifecycle.name": "my_custom_policy"}
}

验证是否生效

GET /my_index/_ilm/explain

其他

添加字段禁止自动创建倒排索引

dynamic的取值类型如下:

取值是否添加字段到映射是否存储字段数据是否抛出异常适用场景
true数据结构不固定,需要动态添加字段。
false数据结构固定,但需要存储未知字段。
strict--数据结构严格固定,不允许未知字段。

true: 默认,添加倒排索引、储存字段

false:只会存储字段

strict:不支持自动添加字段,需要手动维护

(建议:如果字段是动态的,需要自动映射,则使用true;否则使用strict。避免出现创建多余的映射现象。。原因:索引不容易修改,建议手动创建映射

 手动添加字段:

PUT /my_index/_mapping   
{"properties": {"age": { "type": "integer" }}
}

 

索引模板

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

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

相关文章

C#实现本地Deepseek模型及其他模型的对话v1.4

前言 系 统:Window11 开发工具:Visual Studio 2022 相关技术:C# 、WPF .Net 8.0 1、C#实现本地AI聊天功能 WPFOllamaSharpe实现本地聊天功能,可以选择使用Deepseek 及其他模型。 新增根据聊天记录回复的功能。 优化了部分ViewModel&#xff…

若依框架-给sys_user表添加新字段并获取当前登录用户的该字段值

目录 添加字段 修改SysUser类 修改SysUserMapper.xml 修改user.js 前端获取字段值 添加字段 若依框架的sys_user表是没有age字段的,但由于业务需求,我需要新添加一个age字段: 修改SysUser类 添加age字段后,要在SysUser类 …

用Qt手搓AI助手,挑战24小时开发DeepSeek Assistant!

一、项目需求分析与技术选型 DeepSeekAssistant是一款基于深度求索(DeepSeek)API的智能对话助手,核心需求包括: 用户界面友好:支持多轮对话展示数据持久化:历史记录存储与检索异步网络通信:AP…

linux 软件扩展GPU显存

概述 共享内存可以通过 Unified Memory(统一内存)来实现,它允许 CPU 和 GPU 共享相同的内存地址空间,从而方便数据的传输和访问。 利用该技术可解决家用GPU 机器学习时显存不足的问题 (注: 虽然解决了爆显…

Linux——进程初步

学进程前我们需要知道什么? 一、冯诺依曼体系结构 图中就是我们电脑运作时的大致工作流程,其中输入设备、输出设备我们也叫外设。其中,输入设备有比如键盘、鼠标、磁盘、摄像头等。输出设备有显示器、磁盘、打印机等。图中的存储器我们也叫内…

LeetCode-122. 买卖股票的最佳时机 II

其实这题画个折线图就很清晰了&#xff0c;因为我们每天都可以买卖股票&#xff0c;所有我们就只计算上升趋势的股票收益就好了&#xff0c;最小刻度为1&#xff0c;进行差值计算&#xff0c;取总和。 var maxProfit function(prices){let sum0;for(let i1;i<prices.leng…

关于前后端整合和打包成exe文件的个人的总结和思考

前言 感觉有很多东西&#xff0c;不知道写什么&#xff0c;随便写点吧。 正文 前后端合并 就不说怎么开发的&#xff0c;就说点个人感觉重要的东西。 前端用ReactViteaxios随便写一个demo&#xff0c;用于CRUD。 后端用Django REST Framework。 设置前端打包 import { …

Vue | 开学第一课!零基础教程

目录 背景介绍 安装方式 下载环境软件 NodeJS手册 如何查看node版本 镜像源 完整流程 创建根文件夹并拖进 VSCode 调用控制台 安装 vite 脚手架 配置项目 安装依赖 启动项目 查看页面 问题 创建项目失败 解决方法 权限问题 解决方法 其他问题 背景介绍 今…

泛微ecode的页面开发发送请求参数携带集合

1.在开发过程中我们难免遇见会存在需要将集合传递到后端的情况&#xff0c;那么这里就有一些如下的注意事项&#xff0c;如以下代码&#xff1a; // 新增action.boundasync addQuestion(formData) {var theList this.questionAnswerList;var questionAnswerListArray new Ar…

Tomato靶机攻略

将tomato改为NAT模式 扫描ip arp-scan -l 扫描端口&#xff0c;发现ssh服务端口从22改为2211 扫描目录 发现http://192.168.31.134/antibot_image/ 访问 查看所有php文件的源码&#xff0c;看看有什么不同的地方 在info.php的源码中发现问题 在输入后&#xff0c;成功显示…

EasyRTC嵌入式音视频通话SDK:基于纯C语言的跨平台实时通信系统设计与实践

随着物联网、移动互联网的快速发展&#xff0c;实时音视频通信技术在智能硬件、远程协作、工业控制等领域广泛应用。然而&#xff0c;跨平台兼容性差、资源占用高、定制化难等问题&#xff0c;仍是传统RTC方案的痛点。 EasyRTC嵌入式音视频通话SDK凭借纯C语言设计与全平台覆盖…

HCIP复习拓扑练习(修改版)

拓扑&#xff1a; 实际&#xff1a; 需求&#xff1a; 需求分析 1.这意味着学校内部网络能够正常解析域名并进行互联网访问。 2. PC1和PC2处于同一个内网192.168.1.0/24&#xff0c;其中PC1有权限访问外部网段3.3.3.0/24&#xff0c;而PC2没有。这涉及ACL&#xff08;访问控制…

vue-next-admin修改配置指南

目录 1.如何开启侧边栏logo 2.修改侧边栏顶部的logo与文字 3.修改侧边栏路由logo 4.浏览器标题栏图标与文字修改 5.修改侧边栏的背景颜色、顶部导航栏背景颜色、字体颜色、激活时颜色等 6.去除或添加修改右上方放大、信息、头像昵称&#xff08;登录获取之后存储进行修改图…

ruoyi-cloud-plus编译记录-1

dockerfile部署jar 添加一个run configuration ‘ruoyi-nacos’ run configuration 参考Docker - 在IntelliJ IDEA中一键部署项目 - hucat - 博客园 jar包编译不成功&#xff0c;没有jar&#xff0c;docker部署nacos就没法进行下去 参考链接 maven 构建报错 This failure was…

【算法day8】整数反转

整数反转 https://leetcode.cn/problems/reverse-integer/description/ class Solution { public:int reverse(int x) {int MAX_LENGTH 11; // 32位整数的最大数字的位数int* num (int*)calloc(sizeof(int), MAX_LENGTH); //用于保存进位每一位的数字int current x;int pos…

MySQL库和表的操作详解:从创建库到表的管理全面指南

目录 一、MySQL库的操作详解 〇、登录MySQL 一、数据库的创建与字符集设置 1. 创建数据库的语法 2. 创建数据库示例 查看创建出来的文件: bash下查看MySQL创建的文件 二、字符集与校验规则 1. 查看系统默认设置 2. 查看支持的字符集与校验规则 3. 校验规则对查询的影响…

Linux中的基本指令(上)

目录 ls指令 判断linux中文件 pwd指令 认识路径 ​编辑 绝对路径/相对路径 cd指令 简要理解用户 理解家目录 echo指令和printf指令 touch指令 mkdir指令 cat指令 tree指令 rmdir指令和rm指令 man指令 cp指令 which指令 alias 指令 date指令 cal指令 理解…

WPF 与 GMap.NET 结合实现雷达目标动态显示与地图绘制

概述 雷达上位机是雷达系统中用于数据可视化、分析和控制的核心软件。本文将介绍如何使用 C# 和 WPF 框架开发一个雷达上位机程序&#xff0c;主要功能包括&#xff1a; 显示目标轨迹&#xff1a;在界面上实时绘制雷达探测到的目标轨迹。点击显示详细信息&#xff1a;用户点击…

「string」笔记

参考&#xff1a;比特鹏哥 1. string string是一种类型&#xff0c;指的是字符串&#xff0c;比字符数组更高级 头文件 <string> #include <string>int main() {string a;//未初始化string b "good good";//初始化string c("good sfternoon&q…

AutoGen使用学习

AutoGen使用学习 上篇文件使用使用【autoGenchainlitdeepSeek】实现【多角色、多用户、多智能体对话系统】&#xff0c;本次系统的学习autoGen的使用方法 文章目录 AutoGen使用学习[toc]1-核心知识点2-参考网址3-实战案例1-autoGen安装和基础使用主要功能安装方法使用示例注意事…