七天进阶elasticsearch[two]

批量保存

批量保存是通过_bulk API来实现的

请求方式 post

请求地址 _bulk

通过_bulk操作文档,一般至少有两行参数

第一行用于确定要干什么(插入,修改还是删除)

第二行才是操作的数据;

当然以上是标准操作,也可以不遵循标准操作,使用不同的请求方式来完成

批量保存demo:

localhost:9200/_bulk  post请求{"create":{"_index":"book","_type":"_doc","_id":3}}{"id":3,"title":"一战历史","price":99.99}{"create":{"_index":"book","_type":"_doc","_id":4}}{"id":4,"title":"二战历史","price":99.99}

批量保存/替换

批量替换~如果原文档不存在,则创建,否则就是替换:

批量替换demo

{"index":{"_index":"book","_type":"_doc","_id":3}}{"id":3,"title":"西点军校进化史","price":88}{"index":{"_index":"book","_type":"_doc","_id":5}}{"id":5,"title":"黄埔军校建校史","price":188}结果:
可以看到一个是create,一个是update(全量替换)
{"took": 9,"errors": false,"items": [{"index": {"_index": "book","_type": "_doc","_id": "3","_version": 2,"result": "updated","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 2,"_primary_term": 1,"status": 200}},{"index": {"_index": "book","_type": "_doc","_id": "5","_version": 1,"result": "created","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 3,"_primary_term": 1,"status": 201}}]
}

批量保存时如果使用create,若有重复_id,则会报错(除非让es自动生成新的id即批量保存时不指定id);
如果使用index,则如果有重复_id,则重复的会被替换,没有的则会新增;

批量删除:

localhost:9200/_bulk  post 请求
{"delete":{"_index":"book","_type":"_doc","_id":4}}
{"delete":{"_index":"book","_type":"_doc","_id":5}}

结果:

{"took": 18,"errors": false,"items": [{"delete": {"_index": "book","_type": "_doc","_id": "4","_version": 2,"result": "deleted","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 4,"_primary_term": 1,"status": 200}},{"delete": {"_index": "book","_type": "_doc","_id": "5","_version": 2,"result": "deleted","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 5,"_primary_term": 1,"status": 200}}]
}

批量更新:


localhost:9200/_bulk  post 请求
body:
{"update":{"_index":"book","_type":"_doc","_id":3}}
{"doc":{"title":"中华上下五千年","price":100}}

组合应用

组合应用~在一次请求中完成批量操作,包括创建,更新,删除,替换等操作;


{"create":{"_index":"book","_type":"_doc","_id":"id"}}
{"id":1,"title":"资治通鉴","price":66}
{"index":{"_index":"book","_type":"_doc","_id":"id"}}
{"id":2,"title":"三国志","price":76}
{"delete":{"_index":"book","_type":"_doc","_id":3}}
{"update":{"_index":"book","_type":"_doc","_id":5}}
{"doc":{"id":8,"title":"三国志2","price":76}}

结果:

{"took": 14,"errors": false,"items": [{"create": {"_index": "book","_type": "_doc","_id": "id","_version": 1,"result": "created","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 11,"_primary_term": 1,"status": 201}},{"index": {"_index": "book","_type": "_doc","_id": "id","_version": 2,"result": "updated","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 12,"_primary_term": 1,"status": 200}},{"delete": {"_index": "book","_type": "_doc","_id": "3","_version": 6,"result": "deleted","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 13,"_primary_term": 1,"status": 200}},{"update": {"_index": "book","_type": "_doc","_id": "5","_version": 2,"result": "updated","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 14,"_primary_term": 1,"status": 200}}]
}

批量读取:

mget

localhost:9200/_mget    post 请求
{"docs":[{"_index":"book","_id":4},{"_index":"book","_id":5}]
}

mget 简化后~即请求时带上索引类型,然后请求参数只写id即可;

localhost:9200/book/_mget
{"ids":[4,5]
}``注意:请求时如果像下面这样也会请求成功,说明es背后支持将字符串转为数字​```json{"docs":[{"_index":"book","_id":"4"},{"_index":"book","_id":"5"}]
}

返回结果:

{"docs": [{"_index": "book","_type": "_doc","_id": "4","_version": 2,"_seq_no": 15,"_primary_term": 1,"found": true,"_source": {"id": 4,"title": "中华上下五千年","price": 100}},{"_index": "book","_type": "_doc","_id": "5","_version": 3,"_seq_no": 16,"_primary_term": 1,"found": true,"_source": {"id": 5,"title": "三国志2","price": 100}}]
}

批量读取,如果请求的id不存在,则不会返回该id对应的数据,只会返回found:false;

批量查询

批量是读取用postman与 kibana发送请求时的一些区别:

kibana中

GET /book/_msearch{}{"query": {"match_all":{}}}{"index": "book1"}{"query": {"match_all":{}}}

ruguo 去掉 第一个{},则会报错,报错如下

{"error": {"root_cause": [{"type": "illegal_argument_exception","reason": "key [query] is not supported in the metadata section"}],"type": "illegal_argument_exception","reason": "key [query] is not supported in the metadata section"},"status": 400
}

如果使用postman请求,则需要去掉第一个{},否则也会报错

在kibana中使用请求与postman中使用请求的区别:

kibana中:
GET /book/_msearch
{}
{"query": {"match_all":{}}}
{"index": "book1"}
{"query": {"match_all":{}}}对应在postman中:
localhost:9200/book/_msearch{"query":{"match_all":{}}}
{"index":"book1"}
{"query":{"match_all":{}}}首先我们请求时在url上添加了一个index,
在postman中,请求时,需要去掉第一个{},但是kibana中不需要去掉,否则会报错将url去掉index,
kibana中:
GET /_msearch
{"index":"book"}
{"query":{"match_all":{}}}
{"index":"book1"}
{"query":{"match_all":{}}}postman中:这样写会报错,
localhost:9200/_msearch
{"index":"book"}
{"query":{"match_all":{}}}
{"index":"book1"}
{"query":{"match_all":{}}}

那么想要查询 索引 book 与book1怎么办?

可以用之前的方式:
localhost:9200/_search

{"query": {"bool": {"should":[{"match":{"_index":"book"}},{"match":{"_index":"book1"}}]}}
}

ES检索原理

ES检索原理:不断缩小数据范围,同时把随机的时间变为顺序事件

当我们去搜索某个关键词时,ES首先会根据他的前缀后者后缀快速去匹配数据所在的范围以减少磁盘io的次数

所以es需要维护

单词词典:记录所有文档的单词,记录单词与倒排表的关系
倒排列表:记录单词出现的文档,记录文档与单词的关系
倒排索引项:
文档id:记录单词出现的文档id
词频:记录单词出现的次数,用于相关性评分
位置:记录单词出现的位置,用于短语搜索
偏移量:记录单词出现的位置,用于短语搜索,实现高亮显示;
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

谈到检索,就不得不谈到es中的分词器
,针对es目前有多种分词器,每种分词器也有多种不同的分词方案
1.ik分词器:ik_smart,ik_max_word
2.jieba分词器:jieba
3.hanlp分词器:hanlp
等等,目前我们常用的适合中文的分词器是ik
es默认的分词器是standard,会单子拆分
ik_smart:会做最粗力度的拆分
ik_max_word:会做最细粒度的拆分

举个例子:


#默认分词器
POST _analyze
{"analyzer": "standard","text": "蓦然回首,那人却在灯火阑珊处"
}POST _analyze
{"analyzer": "ik_smart","text": "蓦然回首,那人却在灯火阑珊处"
}POST _analyze
{"analyzer": "ik_max_word","text": "蓦然回首,那人却在灯火阑珊处"
}分词器对英文,英文分词器是standard,会做最细粒度的拆分,所以送我们在设置分词器时要考虑那种分词器对于我们更合适
POST _analyze
{"analyzer": "standard","text": "I have a pen"
}POST _analyze
{"analyzer": "ik_smart","text": "I have a pen"
}POST _analyze
{"analyzer": "ik_max_word","text": "I have a pen"
}

回顾:我们在创建索引时可以指定索引类型

PUT /test
{"settings": {"index": {"analysis.analyzers.default.type": "ik_max_word"}}
}
GET /test/_settings

大数据量查询

es 对大数据量查询做了一些限制

比如要查询两万条数据

GET /book/_search
{"query": {"match_all": {}}, "size": 20000
}

返回

...部分..."reason" : "Result window is too large, from + size must be less than or equal to: [10000] but was [20000]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level setting."

可以看到es限制了返回的数据量,如果要查询两万条数据,则需要分页查询,分页查询时,需要使用scroll api,scroll api是es提供的一个api,可以解决大数据量查询的问题

当然,我们也可以通过修改限制来解决大数据量查询的问题,但是修改限制,会影响es的性能,所以不建议修改限制
而且修改限制只会对当前已经有的索引生效,之后创建的索引并不会生效;

PUT /_all/_settings
{"index.max_result_window":"20000"
}

此时再去查询 20000条数据,就不会报错了,

但是我们在创建一个新的索引

PUT /newindexGET /newindex/_search
{"query": {"match_all": {}}, "size": 20000
}

这是仍然会返回 错误,因为新的索引没有修改限制,所以需要修改限制,足以见得官方并不想让我们通过修改数据量限制的方式来消除此种错误,
修改后的代价就是增加了内存消耗,所以官方不建议修改限制

g the [index.max_result_window] index level setting."

可以看到es限制了返回的数据量,如果要查询两万条数据,则需要分页查询,分页查询时,需要使用scroll api,scroll api是es提供的一个api,可以解决大数据量查询的问题当然,我们也可以通过修改限制来解决大数据量查询的问题,但是修改限制,会影响es的性能,所以不建议修改限制
而且修改限制只会对当前已经有的索引生效,之后创建的索引并不会生效;```json
PUT /_all/_settings
{"index.max_result_window":"20000"
}

此时再去查询 20000条数据,就不会报错了,

但是我们在创建一个新的索引

PUT /newindexGET /newindex/_search
{"query": {"match_all": {}}, "size": 20000
}

这是仍然会返回 错误,因为新的索引没有修改限制,所以需要修改限制,足以见得官方并不想让我们通过修改数据量限制的方式来消除此种错误,
修改后的代价就是增加了内存消耗,所以官方不建议修改限制

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

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

相关文章

浅谈申请小程序地理位置权限的正确打开方式

小程序地理位置接口有什么功能? 这篇内容会教大家如何快速申请“获取当前的地理位置(onLocationChange)”接口,以便帮助大家顺利开通接口。以下内容是本人经历了多次的申请经历得出来的经验,来之不易,望大家…

【Python】让我们来生成二维码吧

准备操作 安装qrcode包:pip install qrcode[pil] 安装Pillow包:pip install Pillow 代码 import qrcode import hashlibdef generate_filename(url):data_bytes url.encode("utf-8")file_name hashlib.sha256(data_bytes).hexdigest()re…

图卷积网络原理及实践

图神经网络 (GNN) 是深度学习领域最吸引人且发展最快的架构之一。作为旨在处理图结构数据的深度学习模型,GNN 具有非凡的多功能性和强大的学习能力。 在各种类型的 GNN 中,图卷积网络 (GCN) 已成为最流行且应用最广泛的模型。GCN 具有创新性&#xff0c…

现在有一个生产计划,甲乙丙3个品类共16个产品,生产时间6天,每天甲品类可以生产1张单,乙3张,丙1张,请用MySQL写出H列的效果

现在有一个生产计划,甲乙丙3个品类共16个产品,生产时间6天,每天甲品类可以生产1张单,乙3张,丙1张,请用MySQL写出H列的效果吗? 最终展示结果要求为: 品类产品生产时间开始生产时间…

Android开机动画压缩包zip,自制开机动画(基于Android10.0.0-r41)

文章目录 Android开机动画压缩包zip,自制开机动画1.Android加载压缩包原理2.自制开机动画 Android开机动画压缩包zip,自制开机动画 1.Android加载压缩包原理 这里有个md文件我们看下 核心部分, 首先要创建一个文件叫做desc.txt,这是规定的…

【AI】你要的U-KAN来了

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 U-KAN来了,快是真的快的,上个月才出的KAN,不得不说快。 先占个坑,有时间细看。 下面放上摘要 1. 正文 …

Django 外键关联数据

在设计数据库的时候,是得需要通过外键的形式将各个表进行连接。 原先的表是这样的 要想更改成这样: 下面是操作步骤: 有两张表是关联的 # 在 models.py 里创建class Department(models.Model):"""部门表""&quo…

基于Arduino的简易磁悬浮装置原理图和源代码分享

磁悬浮装置原理 大家可能都玩过这种磁悬浮玩具,它们的工作原理与此类似。 首先,让我们了解一下这个原理,其实非常简单。它主要依赖于磁力对悬浮物体的控制。基本原理如下:在浮子的正下方放置一个霍尔传感器。当传感器检测到浮子向…

Android Compose 十:常用组件列表 监听

1 去掉超出滑动区域时的拖拽的阴影 即 overScrollMode 代码如下 CompositionLocalProvider(LocalOverscrollConfiguration provides null) {LazyColumn() {items(list, key {list.indexOf(it)}){Row(Modifier.animateItemPlacement(tween(durationMillis 250))) {Text(text…

七天进阶elasticsearch[one]

elasticSearch 概述 Elasticsearch是一个近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个很小的延迟(通常是一秒) 集群 一个集群就是由一个或多个节点组织在一起, 它们共同持有你全部的数据&#x…

【第8章】SpringBoot实战篇之文章分类(上)

文章目录 前言一、后端代码1. CategoryController2. service3. CategoryMapper4. Category 二、测试1. 失败(校验)2.正常 总结 前言 从这开始进入文章相关的接口开发,本章主要介绍定义文章分类接口和新增文章分类 建表语句和测试用例,在SpringBoot专栏首…

pyspark中使用mysql jdbc报错java.lang.ClassNotFoundException: com.mysql.jdbc.Driver解决

报错信息: py4j.protocol.Py4JJavaError: An error occurred while calling o33.load. : java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 我的解决方法: 这个报错就是提示你找不到jar包,所以你需要去下载一个和你mysql版本匹配的j…

智慧园区智能化系统整体解决方案(111页PPT)

方案介绍: 智慧园区智能化系统整体解决方案是一个综合性的管理平台,它通过集成视频、报警、园区一卡通、产线管理、能耗管理、公共广播、信息发布等多种系统,实现园区的全方位智能化管理。该系统以基础管理平台为系统基础,提供系…

实验五、IPv4地址的子网划分,第1部分《计算机网络》

但凡你有点本事,也不至于一点本事都没有。 目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 完成本练习之后,您应该能够确定给定 IP 地址和网络掩码 的网络信息。本练习旨在让您掌握如何根据给定 IP 地址计算网络 IP 地址信息。 二、实验…

VBA发送邮件的常用方法?VBA如何自动发信?

VBA发送邮件需要配置什么设置?怎么使用VBA发送邮件? 使用VBA自动化处理任务是非常常见的,尤其是在发送邮件方面。通过VBA发送邮件,不仅可以提高工作效率,还能减少人为操作的错误。AokSend将详细介绍VBA发送邮件的常用…

MBR10100FCT-ASEMI肖特基二极管MBR10100FCT

编辑:ll MBR10100FCT-ASEMI肖特基二极管MBR10100FCT 型号:MBR10100FCT 品牌:ASEMI 封装:TO-220F 最大平均正向电流(IF):10A 最大循环峰值反向电压(VRRM)&#xff1…

新风口还是割韭菜?全域外卖加盟究竟真是假?

随着全域外卖加盟模式的兴起,与之相关的骗局不断增多,并由此引发了外界对于全域外卖加盟模式真实性的质疑,全域外卖加盟是真的吗等相关问题更是一举成为全域外卖交流群中的热点话题。 事实上,就目前的情况而言,全域外卖…

数据资产运营平台解决方案

一、前言 数据资产管理运营平台是涵盖数据资产确权、登记、核验、质量评价、价值评估、定价、增值、入表、安全等全流程业务的数据要素市场基础设施。落实数据产业制度供给,构建数据要素市场,汇集数据资源供给服务,为数据要素流通交易提供平…

BERT应用——文本相似度计算

本文展示了如何利用BERT模型计算两个文本字符串之间的余弦相似度。BERT(Bidirectional Encoder Representations from Transformers)是一种基于Transformer架构的预训练模型,广泛应用于自然语言处理领域。BERT的核心创新在于其双向训练的机制…

Cartographer学习笔记

Cartographer 是一个跨多个平台和传感器配置提供 2D 和 3D 实时同步定位和地图绘制 (SLAM) 的系统。 1. 文件关系 2. 代码框架 common: 定义了基本数据结构和一些工具的使用接口。例如,四舍五入取整的函数、时间转化相关的一些函数、数值计算的函数、互斥锁工具等…