当前位置: 首页 > 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:…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

大数据学习(132)-HIve数据分析

​​​​🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言&#x1f4…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

蓝桥杯 冶炼金属

原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

GitHub 趋势日报 (2025年06月06日)

📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...