当前位置: 首页 > news >正文

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:ssyyyy-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 typedymaicruntime
true|falsebooleanboolean
小数floatdouble
整数longlong
objectobject-
数组取决于数组中第一个非空元素的类型同左
日期格式字符串datedate
数字类型字符串text
其它字符串text+keywordkeyword

自动映射模版

将某一类字段自动映射成特定的数据类型

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:…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...