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的

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

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

相关文章

c++ map对其值排序

无法直接排序,转换成vector<std::pair<string,int>> #include <iostream> #include <map> #include <vector> #include <algorithm>// 用于排序的比较函数 bool compareByValue(const std::pair<std::string, int>& a, const …

PysimpleGUI试用版变更免费版

1、PysimpleGUI试用版&#xff1a; 由于5.0版本之后不是免费的 2、变更版本&#xff1a; 打开pycharm-设置-python解释器&#xff1a;点击 搜索PysimpleGUI-指定版本-选择低于5.0的版本&#xff1a;安装软件包 3、重新运行PysimpleGUI&#xff0c;即可获得免费版&#xff1a;…

Grule前端表单post后端执行grule引擎规则

Grule前端表单post后端执行grule引擎规则 编写前端表单和后端接口 编写test.go执行grule引擎规则 示例都是 go test 执行的测试代码&#xff0c;所以将里面的测试代码去除 由于之前 NumberExponentExample_test.go 已经验证可运行, 所以将 err 的异常处理去除 package mai…

STM32串口接收与发送(关于为什么接收不需要中断而发生需要以及HAL_UART_Transmit和HAL_UART_Transmit_IT的区别)

一、HAL_UART_Transmit和HAL_UART_Transmit_IT的区别 1. HAL_UART_Transmit_IT&#xff08;非阻塞模式&#xff09;&#xff1a; HAL_UART_Transmit_IT 是非阻塞的传输函数&#xff0c;也就是说&#xff0c;当你调用 HAL_UART_Transmit_IT 时&#xff0c;它不会等到数据完全发…

使用R语言优雅的获取任意区域的POI,道路,河流等数据

POI是“Polnt of Information”的缩写&#xff0c;中文可以翻译为“信息点”。是地图上任何非地理意义的有意义的点&#xff0c;如商店&#xff0c;酒吧&#xff0c;加油站&#xff0c;医院&#xff0c;车站等。POI&#xff0c;道路网&#xff0c;河流等是我们日常研究中经常需…

七、docker registry

七、docker registry 7.1 了解Docker Registry 7.1.1 介绍 registry 用于保存docker 镜像&#xff0c;包括镜像的层次结构和元数据。启动容器时&#xff0c;docker daemon会试图从本地获取相关的镜像&#xff1b;本地镜像不存在时&#xff0c;其将从registry中下载该镜像并保…

目标跟踪算法:SORT、卡尔曼滤波、匈牙利算法

目录 1 目标检测 2 卡尔曼滤波 3《从放弃到精通&#xff01;卡尔曼滤波从理论到实践》视频简单学习笔记 3.1 入门 3.2 进阶 3.2.1 状态空间表达式 3.2.2 高斯分布 3.3 放弃 3.4 精通 4 匈牙利算法 5 《【运筹学】-指派问题&#xff08;匈牙利算法&#xff09;》视…

OpenCV-图像阈值

简单阈值法 此方法是直截了当的。如果像素值大于阈值&#xff0c;则会被赋为一个值&#xff08;可能为白色&#xff09;&#xff0c;否则会赋为另一个值&#xff08;可能为黑色&#xff09;。使用的函数是 cv.threshold。第一个参数是源图像&#xff0c;它应该是灰度图像。第二…

【HarmonyOS NEXT】实现Tabs组件的TabBar从左到右依次排列

一、背景 系统提供的Tabs目前只能居中展示&#xff0c;暂不支持居左显示&#xff0c;现有的需求是需要Tabs从左往右排列显示&#xff0c;考虑通过Scroll和Row组件来实现 二、实现思路 通过Scroll和Row组件用来实现一个页签&#xff0c;在onclick事件中通过修改索引值和Tabs组…

16-03、JVM系列之:内存与垃圾回收篇(三)

JVM系列之&#xff1a;内存与垃圾回收篇(三) ##本篇内容概述&#xff1a; 1、执行引擎 2、StringTable 3、垃圾回收一、执行引擎 ##一、执行引擎概述 如果想让一个java程序运行起来&#xff0c;执行引擎的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。 简…

FPGA工作原理、架构及底层资源

FPGA工作原理、架构及底层资源 文章目录 FPGA工作原理、架构及底层资源前言一、FPGA工作原理二、FPGA架构及底层资源 1.FPGA架构2.FPGA底层资源 2.1可编程输入/输出单元简称&#xff08;IOB&#xff09;2.2可配置逻辑块2.3丰富的布线资源2.4数字时钟管理模块(DCM)2.5嵌入式块 …

【JVM】JVM基础教程(一)

目录 初识JVM JVM是什么&#xff1f; JVM的功能 解释、即时编译和运行 内存管理 常见的JVM JVM虚拟机规范 HotSpot的发展历程 JVM的组成 字节码文件详解 应用场景 以正确姿势打开字节码文件 ​编辑字节码文件的组成 基本信息 Magic魔数 主副版本号 常量池 接口…

无监督学习笔记 - A Cookbook of Self-Supervised Learning

无监督学习笔记 参考资料&#xff1a; 无监督学习Cookbook 几乎总结了所有的自监督学习方法,阅读过程中&#xff0c;根据参考文献索&#xff0c;进一步深入阅读每个方法具体得细节&#xff0c;掌握该论文&#xff0c;基本上就掌握了所有自监督学习的方法与基础。 统计学习方法…

Trimble X9三维激光扫描仪高效应对化工厂复杂管道扫描测绘挑战【沪敖3D】

化工安全关系到国计民生&#xff0c;近年来随着化工厂数字化改革不断推进&#xff0c;数字工厂逐步成为工厂安全管理的重要手段。而化工管道作为工厂设施的重要组成部分&#xff0c;由于其数量多、种类繁杂&#xff0c;一直是企业管理的重点和难点。 传统的化工管廊往往缺乏详…

synchronized的特性

1.互斥 对于synchronized修饰的方法及代码块不同线程想同时进行访问就会互斥。 就比如synchronized修饰代码块时&#xff0c;一个线程进入该代码块就会进行“加锁”。 退出代码块时会进行“解锁”。 当其他线程想要访问被加锁的代码块时&#xff0c;就会阻塞等待。 阻塞等待…

【vue3 for beginner】Pinia基本用法:存储user的信息

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 Pinia 简介 Pinia 是一个用于 Vue.js 应用的状态管理库&#xff0c;是 Vuex 的…

动态规划(二) ---斐波那契型深度解析

一、使用最小花费爬楼梯 题目链接&#xff1a;746. 使用最小花费爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a;给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一…

记录一下,解决js内存溢出npm ERR! code ELIFECYCLEnpm ERR! errno 134 以及 errno 9009

项目是个老项目&#xff0c;依赖包也比较大&#xff0c;咱就按正常流程走一遍来详细解决这个问题&#xff0c;先看一下node版本&#xff0c;我用的是nvm管理的&#xff0c;详细可以看我的其他文章 友情提醒&#xff1a;如果项目比较老&#xff0c;包又大&#xff0c;又有一些需…

Luma 视频生成 API 对接说明

Luma 视频生成 API 对接说明 随着 AI 的应用变广&#xff0c;各类 AI 程序已逐渐普及。AI 已逐渐深入到人们的工作生活方方面面。而 AI 涉及的行业也越来越多&#xff0c;从最初的写作&#xff0c;到医疗教育&#xff0c;再到现在的视频。 Luma 是一个专业高质量的视频生成平…

三维扫描检测在汽车制造中的应用

三维扫描&#xff0c;通过先进三维扫描技术获取产品和物体的形面三维数据&#xff0c;建立实物的三维图档&#xff0c;满足各种实物3D模型数据获取、三维数字化展示、3D多媒体开发、三维数字化存档、逆向设计、产品开发、直接3D打印制造或辅助加工制造等一系列的应用。 三维扫描…