elasticsearch基础总结
最近实习,项目用的elasticseatch做的存储库,但是之前对于es接触的不多,查询语法有些不熟,每次想写个DSL查询时都要gpt或者施展搜索大法,所以索性就自己总结总结,以后忘了也方便查。所以这篇文章会持续更新。
数据类型
按照是否支持分词分为两大类:支持分词的数据类型,如text,match_only_text等,不支持的分词的数据类型,如keyword,date,数值型。也可以分为基本数据类型和复杂数据类型。
基本数据类型
数字类型
| 类型 | 说明 |
|---|---|
| byte | |
| integer | |
| short | |
| long | |
| double | |
| float | |
| half_float | 半精度16位浮点数 |
| scaled_float | 缩放类型浮点数,按固定doble比例因为缩放 |
| unsigned_long | 无符号64位整形 |
binary:编码为base64字符串的二进制值
boolean:布尔类型
alias:字段别名
keywords:包括keyword,constant_keyword和wildcard
dates:包括date,date_nanos
date的格式有yyyy-MM-dd HH:mm:ss、yyyy-MM-dd、时间戳
对象关系类型(复杂类型)
- object:非基本数据类型,默认的json对象为object
- flattened:单映射对象类型,其值为json
- nested:嵌套数据类型
- join:父子级关系类型
结构化类型
Range,IP,version,number3
聚合数据类型
aggregate_metric_double,histogram
文本搜索字段
text,completion,
es默认情况下会为text类型创建倒排索引
文档排名类型
空间数据类型
geo_point
其它数据类型
映射参数
analyzer:指定分词器,只有text类型字段才支持
coerce:是否支持强制类型转换
常用DSL总结
索引
-
索引名和字段名命名规范:1.英文全小写 2.不要使用驼峰3.多个单词之间用_分隔
-
索引的不可变性:索引创建成功后,索引名称、主分片数量(但可以修改副本数量)、字段类型不可变。
也不可以删除某个字段,但可以新增字段。
查询索引
es8和es6相同
GET /索引名
或
GET /索引名/_mapping
删除索引
es8和es6相同
DELETE 索引名
创建索引
es8
PUT /索引名
{"settings":{},"mappings": {"properties": {"field1": {"type": "text"},"field2": {"type": "keyword"}}}
}
es8中默认一个索引中只有_doc一种type,创建索引时不用指定type,指定type会报错,指定_doc也不行
es6
PUT /索引名
{"settings":{"number_of_shards": 1,"number_of_replicas": 1},"mappings": {"类型名":{"properties": {"新字段": {"type": "字段类型"}}}}
}
es6中创建索引必须指定类型,不然会报错
修改索引
一个索引一旦创建后不可以删除字段、修改字段数据类型。但可以修改字段的其他属性,如fielddata等
添加新字段
es6
PUT 索引名/_mapping/类型名
{"properties":{"新字段名":{"type":"新字段类型"}}
}
es8
PUT 索引名/_mapping
{"properties":{"新字段名":{"type":"新字段类型"}}
}
修改settings
可以通过settings api修改某些settings,比如副本数量、index_refresh_interval、index_max_result_windows
PUT 索引名/_settings
{"number_of_replicas":3
}
reindex
reindex不是重建索引,而是将一个索引中的数据重建到另一个索引中
POST _reindex
{"source":{"index":"源索引名"},"dest":{"index":"目标索引名"}
}
文档
新增文档
手动指定id,使用PUT
新增文档时可选op_type参数,该参数有create、index两个值。create:不存在则创建,存在则报错。index:不存在则创建,存在则覆盖
# 也可写为 /索引名/_create/文档id
PUT /索引名/_doc/文档id/?op_type=create
{"字段名":"字段值","字段名":"字段值"
}
# 不可写为 /索引名/_index/文档id
PUT /索引名/_doc/文档id/?op_type=index
{"字段名":"字段值","字段名":"字段值"
}
使用index时,如果id为某个值的文档已经存在,则会全量更新!!!
或者
PUT /索引名/_doc/1
{"字段名":"字段值"
}
也是全量替换!!!
自动生成id,使用POST
# 也可以 /索引名/_doc/id 指定id
POST /索引名/_doc
{"属性名":"属性值"
}
查询文档
_source
source api控制返回哪些字段
如果设置为false,则只返回元数据
GET /索引名/_doc/文档id?_source=false #此处值默认就是true
也可以使用_source只查询source源数据,不返回元数据
GET /索引名/_source/文档id
_search
POST /goods/_search
{"query": {"term": {"title": "Apple"}}
}
除了term精准查询,还有range、match、mulit_match
批量查询文档
GET /_mget
{"doc":[{"_index":"索引名","_id":"文档id"},{"_index":"索引名","_id":"文档id"}]
}
# 可以批量查询多个索引里的多个文档
GET /索引名/_mget
{"ids":[1,2]
}
#根据id批量查询一个索引里的多个文档
修改文档
全量修改
覆盖原来的文档,其本质是根据指定id删除原来的文档,新增一个相同id的文档。如果根据id删除时,id不存在,第二步的新增也会执行,也就从修改变成了新增操作了。
PUT /{索引库名}/_doc/文档id
{"字段1": "值1","字段2": "值2",// ... 略
}
其实就是put指定id新增文档
增量修改
只修改指定id匹配的文档中的部分字段
使用_update(只能通过文档id去更新)
POST /索引名/_update/文档id
{"doc":{"属性名":"属性值","属性名":"属性值"}
}
# 通过文档id更新
在7.x之前的版本还可以这样写
POST /索引名/_doc/文档id/_update
{"doc":{"属性名":"属性值"}
}
想通过query定制查询条件来更新文档,得通过_update_by_query,而且必须通过写scripts来更新
删除文档
根据query查询条件删除
删除时并不一定每次都知道文档id,通过具体查询条件删除
POST /索引名/_delete_by_query
{"query":{"term":{//或match"字段名":"字段值"}}
}
bulk
批量插入文档
POST /_bulk
{"action":{"_index":"索引名","_id":"文档id"}}
{"属性名":"属性值","属性名":"属性值"}
{"action":{"_index":"索引名","_id":"文档id"}}
{"属性名":"属性值","属性名":"属性值"}# action的值可选index和create,跟前面一样
批量更新文档
POST /_bulk
{"update":{"_index":"索引名","_id":"文档id"}}
{"doc":{"属性名":"属性值","属性名":"属性值"}}
{"update":{"_index":"索引名","_id":"文档id"}}
{"doc":{"属性名":"属性值","属性名":"属性值"}}
批量删除文档
POST /_bulk
{"delete":{"_index":"goods","_id":"100"}}
{"delete":{"_index":"goods","_id":"101"}}
tips:1. 每个bulk写完后,最后要有一个换行2.bulk中的一个失败不会影响其它的
Mapping
自动映射
es运行可以不用像mysql等关系型数据库一样需要提前创建表结构,可以直接插入文档,由自动映射器自动确定类型。自动映射器推断字段类型的规则:
| field type | dymaic | runtime |
|---|---|---|
| true|false | boolean | boolean |
| 小数 | float | double |
| 整数 | long | long |
| object | object | - |
| 数组 | 取决于数组中第一个非空元素的类型 | 同左 |
| 日期格式字符串 | date | date |
| 数字类型字符串 | text | |
| 其它字符串 | text+keyword | keyword |
自动映射模版
将某一类字段自动映射成特定的数据类型
match_mapping_type
用于匹配数据类型
PUT /索引名
{"mappings":{"dynaic_templates":[{"模版名":{"match_mapping_type":"long","match":"num_*", //表示字段名以num_开头"unmatch":"*_text", //表示字段名不以_text结尾"mapping":{"type":"integer"}}},{"模版名":{"match_mapping_type":"string", //string表示文本"mapping":{"type":"keyword"}}}]}
}
高阶查询
match
POST /索引名/_search
{"query":{"match":{"字段名":"字段值" }}
}
match_all
可以认为和直接GET /索引名/_search查询没什么区别
agregations聚合分析(聚合查询)
语法:
POST product/_search
{"size":0, //不想让结果中包含hits就size为0"aggs":{"查询名字":{"聚合类型":{"field":"字段名","size":10, //设置桶的个数,默认为10"order":{"_count":"asc" //根据每个桶的文档数量升序}}}}
}
Bucket agregations
类比理解为msyql的分组查询,一个桶就是具有相同特征的一个组
聚合类型为terms时,结果:对所有的文档的某字段值进行分组查询

除了terms,还有range、date_histogram等
text类型的字段默认不会建立正排索引,所以桶聚合查询对text类型字段不生效,只对keyword类型生效。text类型字段建立正排索引不现实,而且也没意义。(你一般会在mysql里对varchar100 的desc字段建立索引?)
想对text类型的字段bucket查询,可以设置该字段的fielddata为true,则在查询时会在内存中进行分组,数据量很多时容易导致OOM,不建议这么做。
Metrics agregations指标聚合
例如统计最大、最小,平均值、总和、value_count,聚合类型分别为max、min、avg、sum、该字段值非空的文档数量。stats为这几个全部。
POST /索引名/_search
{"aggs":{"聚合查询名字":{"max":{"field":"字段名,如price"}},"聚合查询名字":{"min":{"field":"字段名,如price"}}}
}
管道聚合
跟linux里的管道一个意思,管道聚合查询就是在一个聚合查询结果作为另一个聚合查询的输入继续聚合查询。
例如查询平均价格最低的商品类型
POST /product/_search
{"aggs":{"查询名字1":{"terms":{"field":"type" //先对商品类型桶聚合}, //在这个的基础上继续聚合查询"aggs":{"查询名称2":{"avg":{"field":"price"}}}}, //这个整个聚合得到了各个分类的平均值"min_bucket":{"min_bucket":{"buckets_path":"查询名字1>查询名字2"}}}
}
在谁的基础上继续聚合查询就和谁平级
组合查询 bool query
must
must表示查询条件都要满足。即 and
GET /索引名/_search
{"query":{"bool":{"must":[ //must的值是数组,数组里的每一个查询条件都要满足{"match":{"字段名":"目标值"}},//在这继续加must的其他查询条件{"match_phrase":{"字段名":"目标值"}}]}}
}
must_not
和must相反,must_not里的所有查询条件都是要排除的数据。即 !
GET /索引名/_search
{"query":{"bool":{"must_not":[ //must_not的值是数组,数组里的每一个查询条件都不满足{"match":{"字段名":"目标值"}},//在这继续加must_not的其他查询条件{"match_phrase":{"字段名":"目标值"}}]}}
}
should
也就是 or
filter
和match一样,也是and,但是filter只是过滤掉不满足条件的文档,不参与评分计算。
并且以上查询都可以组合使用
Script
es设计了painless脚本语言,老版本中用的是Grovvy,但其安全性和性能远不及painless。但painless性能是不及DSL的
!
GET /索引名/_search
{"query":{"bool":{"must_not":[ //must_not的值是数组,数组里的每一个查询条件都不满足{"match":{"字段名":"目标值"}},//在这继续加must_not的其他查询条件{"match_phrase":{"字段名":"目标值"}}]}}
}
should
也就是 or
filter
和match一样,也是and,但是filter只是过滤掉不满足条件的文档,不参与评分计算。
并且以上查询都可以组合使用
Script
es设计了painless脚本语言,老版本中用的是Grovvy,但其安全性和性能远不及painless。但painless性能是不及DSL的
相关文章:
elasticsearch基础总结
最近实习,项目用的elasticseatch做的存储库,但是之前对于es接触的不多,查询语法有些不熟,每次想写个DSL查询时都要gpt或者施展搜索大法,所以索性就自己总结总结,以后忘了也方便查。所以这篇文章会持续更新。…...
【慕伏白教程】Zerotier 连接与简单配置
文章目录 下载与安装WindowsLinuxapt安装官方脚本安装 Zerotier 配置新建网络网络配置 终端配置WindowsLinux 下载与安装 Windows 进入Zerotier官方下载网站,点击下载 在下载目录找到安装文件,双击打开后点击 Install 开始安装 安装完成后,…...
Brain.js(九):LSTMTimeStep 实战教程 - 未来短期内的股市指数预测 - 实操要谨慎
系列的前一文RNNTimeStep 实战教程 - 股票价格预测 讲述了如何使用RNN时间序列预测实时的股价, 在这一节中,我们将深入学习如何利用 JavaScript 在浏览器环境下使用 LSTMTimeStep 进行股市指数的短期预测。通过本次实战教程,你将了解到如何用…...
C# 字符串(String)
文章目录 前言创建 String 对象的方式1. 通过给 String 变量指定一个字符串2. 通过使用 String 类构造函数3. 通过使用字符串串联运算符( )4. 通过检索属性或调用一个返回字符串的方法5. 通过格式化方法来转换一个值或对象为它的字符串表示形式 String …...
二进制文件
大多数人听到“二进制”的时候,脑海里可能马上就会联想到电影《黑客帝国》中由“0”和“1”组成的矩阵。 笔者不打算在这里详细讨论二进制的运算、反码、补码之类枯燥的东西,但有几个和开发相关的概念需要做一点澄清和普及。因为这些内容就像空气——用…...
【电子元器件】音频功放种类
本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时,也能帮助其他需要参考的朋友。如有谬误,欢迎大家进行指正。 一、概述 音频功放将小信号的幅值提高至有用电平,同时保留小信号的细节,这称为线性度。放大器的线性…...
linux之vim
一、模式转换命令 vim主要有三种模式:命令模式(Normal Mode)、输入模式(Insert Mode)和底线命令模式(Command-Line Mode)。 从命令模式切换到输入模式:i:在当前光标所在…...
QT的ui界面显示不全问题(适应高分辨率屏幕)
//自动适应高分辨率 QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);一、问题 电脑分辨率高,默认情况下,打开QT的ui界面,显示不全按钮内容 二、解决方案 如果自己的电脑分辨率较高,可以尝试以下方案:自…...
数据结构--串、数组和广义表
串 定义:串(String)是由零个或多个字符组成的有限序列。 子串:串中任意个连续字符组成的子序列称为该串的子串。 主串:包含子串的串相应地称为主串。 字符位置:字符在该序列中的序号为该字符在串中的位置…...
LLMs之Agent之Lares:Lares的简介、安装和使用方法、案例应用之详细攻略
LLMs之Agent之Lares:Lares的简介、安装和使用方法、案例应用之详细攻略 导读:这篇博文介绍了 Lares,一个由简单的 AI 代理驱动的智能家居助手模拟器,它展现出令人惊讶的解决问题能力。 >> 背景痛点:每天都有新的…...
1-1.mysql2 之 mysql2 初识(mysql2 初识案例、初识案例挖掘)
一、mysql2 概述 mysql2 是一个用于 Node.js 的 MySQL 客户端库 mysql2 是 mysql 库的一个改进版本,提供了更好的性能和更多的功能 使用 mysql2 之前,需要先安装它 npm install mysql2 二、mysql2 初识案例 1、数据库准备 创建数据库 testdb CREAT…...
企业邮箱为什么不能经常群发邮件?
企业邮箱是用企业域名作为后缀的邮箱,虽然企业邮箱确实具备群发邮件的功能,但它更适用于企业内部的群发,而非用于外部推广。如果是在企业邮件域内进行群发,通常可以借助企业邮箱的邮件列表来实现。然而,对于域外的大量…...
集成运算放大电路反馈判断
集成运算放大电路 一种具有很高放大倍数的多级直接耦合放大电路,因最初用于信号运算而得名,简称集成运放或运放 模拟集成电路中的典型组件,是发展最快、品种最多、应用最广的一种 反馈 将放大电路输出信号的一部分或全部通过某种电路引回到输…...
媒体查询、浏览器一帧渲染过程
文章目录 媒体查询语法示例根据视口宽度应用不同的样式根据设备像素比应用不同的样式根据方向应用不同的样式 使用场景 浏览器一帧的渲染过程 媒体查询 媒体查询(Media Query)是CSS3中的一个重要特性,它允许开发者根据设备的特定条件&#x…...
高级排序算法(一):快速排序详解
引言 当我们处理大规模数据时,像冒泡排序、选择排序这样的基础排序算法就有点力不从心了。这时候,快速排序(Quick Sort)就派上用场了。 作为一种基于分治法的高效排序算法,快速排序在大多数情况下可以在O(n log n)的时…...
3.2 网络协议IP
欢迎大家订阅【计算机网络】学习专栏,开启你的计算机网络学习之旅! 文章目录 1 定义2 虚拟互连网络3 分组在互联网中的传送4 IPv4 地址 1 定义 网际协议 IP是 TCP/IP 体系中两个最主要的协议之一,也是最重要的互连网协议之一。IPv4 和 IPv6 …...
2024 一带一路暨金砖国家技能发展与技术创新大赛【网络安全防护治理实战技能赛项】样题(中职组)
2024 一带一路暨金砖国家技能发展与技术创新大赛【网络安全防护治理实战技能赛项】样题(中职组) 1.基础设置和安全强化(xxx 分)1.3. 任务内容: 2.安全监测和预警(xxx 分)2.1. 任务一:建立目录安…...
excel如何让单元格选中时显示提示信息?
现象: 当鼠标放在单元格上,会出现提示信息: 先选中单元格选择上方的【数据】-【数据验证】图标选择【输入信息】勾上【选定单元格时显示输入信息】输入【标题】,如:最上方图中的:姓名:输入【输…...
oscp备考,oscp系列——Kioptix Level 3靶场
Kioptix Level 3 oscp备考,oscp系列——Kioptix Level 3靶场 nmap扫描 主机发现 └─# nmap -sn 192.168.80.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-09 00:33 CST Nmap scan report for 192.168.80.1 Host is up (0.00014s latency). MAC…...
信创改造-达梦数据库配置项 dm.ini 优化
设置模式:兼容MySQL,COMPATIBLE_MODE 4 内存占比:90%,MAX_OS_MEMORY 90 目标内存:2G(不影响申请内存超过2G,但这部分内存不会回收),MEMORY_TARGET 2000 参考 https:…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...
