七天进阶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 /newindex


GET /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 /newindex


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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

故障预警 vs 故障分类:哪个更有意义,哪个更具挑战性?

故障预警 vs 故障分类:哪个更有意义,哪个更具挑战性? 在现代工业系统中,风力发电机、制造设备等关键装置的可靠性和稳定性对生产效率至关重要。为此,故障预警和故障分类成为保障设备正常运行的重要手段。那么&#xf…

备份和恢复realme智能手机:综合指南

realme自2018年成立至今,一直秉持着“敢于超越”的品牌精神,专注于为全球年轻用户提供性能卓越、设计新颖的高品质手机。对于如何备份和恢复realme手机,本文将介绍多种不同的方法。 第1部分:使用Coolmuster Android Backup Mana…

怎解ESP-ADF组件 error: unknown type name ‘xSemaphoreHandle‘

没有定义,看一下最上面的头文件。 通过看最上面的头文件引入,可以看到信号量头文件已经有了,那很明显就是类型的兼容的问题,打开MenuConfig开启向后兼容API的选项。 问题解决。

CVE-2024-2961:将phpfilter任意文件读取提升为远程代码执行(RCE)

0x00 前言 前几天p牛师傅在星球发了一个帖子:PHP利用glibc iconv()中的一个缓冲区溢出漏洞CVE-2024-2961,实现将文件读取提升为任意命令执行漏洞,当时觉得这个漏洞蛮有意思,就想研究一下。于是web狗开启了一次二进制漏洞的学习之…

输出有10个元素的整型数组各元素的值

(1)下标法 编写程序: (2)指针法: 将上面程序第7行和第10行的a[i]改为"*(ai)"。 (3)用指针变量指向数组元素 编写程序: 运行结果: 对3种方法的比…

家政上门按摩小程序源码 仿东郊到家小程序源码

家政上门按摩小程序源码 仿东郊到家小程序源码 实用行业 适用于:预约私教,预约瑜伽/健身、预约美容/美发/美甲、预约理疗/足疗/推拿、预约清洁/保洁/保安、预约洗车/维修/安装、预约保姆/月嫂/护工/洗衣/烧饭、钟点工等暖心服务。在家政市场上&#xf…

数据结构复习

基本概念和术语: 数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。 数据元素:是组成数据的,具有一定意义的基本单位,在计算机…

ChatGPT Prompt技术全攻略-入门篇:AI提示工程基础

系列篇章💥 No.文章1ChatGPT Prompt技术全攻略-入门篇:AI提示工程基础2ChatGPT Prompt技术全攻略-进阶篇:深入Prompt工程技术3ChatGPT Prompt技术全攻略-高级篇:掌握高级Prompt工程技术4ChatGPT Prompt技术全攻略-应用篇&#xf…

nvm详细安装使用教程(nvm-node多版本管理工具),详细命令

nvm是什么 NVM 是 Node Version Manager 的缩写,它是一个用于管理 Node.js 版本的命令行工具。通过NVM,你可以在同一台机器上安装和切换多个 Node.js 版本,对于开发和测试在不同 Node.js 版本上运行的应用程序非常有用。 1、卸载node&#…

【C++课程学习】:C++入门(输入输出,缺省参数)

🎁个人主页:我们的五年 🔍系列专栏:C课程学习 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 🍩1.关于C输入输出: 🍩2.缺省参数函数: 缺省参数的概…

Allegro-开店指南

开店指南 Allegro企业账户注册流程 Allegro注册流程分成两个主要阶段: 第一创建您的账户,第二激活您账户的销售功能。完成两个阶段,才能在Allegro进行销售。 中国企业应该入驻Business account(企业账户)。 第二阶段&#xff…

通用高电子迁移率晶体管(HEMT)的差分微变解算方案及分析型模型

来源:A Difference-Microvariation Solution and Analytical Model for Generic HEMTs(TED 22年) 摘要 这篇论文提出了一种AlGaN/GaN和AlGaAs/GaAs基高电子迁移率晶体管(HEMT)的分析型直流模型。该模型考虑了高栅偏压下势垒层中积累的电荷。…

Vue2项目错误提示:Vue: <template v-for> key should be placed on the <template> tag.

1. 场景还原 升级了最新的Webstorm后打开Vue2项目提示以下波浪线错误&#xff1a; Vue: <template v-for> key should be placed on the <template> tag. 该错误不会影响正常运行和构建&#xff0c;但我们看到了会不舒服。 2. 错误原因 Vue2中key不能放在temp…

iOS 之homebrew ruby cocoapods 安装

cocoapods安装需要ruby&#xff0c;更新ruby需要rvm&#xff0c;下载rvm需要gpg&#xff0c;下载gpg需要homebrew&#xff0c;所以安装顺序是homebrew->gpg->rvm->ruby-cocoapods Rvm 官网&#xff1a; RVM: Ruby Version Manager - RVM Ruby Version Manager - Docum…

夏季高温来袭|危化品如何安全储存?

《危险化学品安全管理条例》第三条 本条例所称危险化学品&#xff0c;是指具有毒害、腐蚀、爆炸、燃烧、助燃等性质&#xff0c;对人体、设施、环境具有危害的剧毒化学品和其他化学品。 随着夏天高温的来袭&#xff0c;炎热的天气对危化品储存威胁巨大&#xff0c;危化品事故也…

Vulnhub-DC-3

joomla3.7.0的提权 信息收集 靶机IP:192.168.20.136 kaliIP:192.168.20.128 网络有问题的可以看下搭建Vulnhub靶机网络问题(获取不到IP) 首先nmap扫端口和版本&#xff0c;dirsearch跑下目录&#xff0c;wappalyzer也可以用下 发现服务器用的ubuntu&#xff0c;JoomlaCMS…

openh264 中背景检测功能源码分析

文件位置 openh264/codec/processing/src/BackgroundDetection.cpp 代码流程 核心函数 从代码流程可以看到实现背景检测的核心功能主要是CBackgroundDetection类中ForegroundBackgroundDivision函数和ForegroundDilationAndBackgroundErosion函数。 原理 参数开关控制&…

【WRF理论第二期】运行模型的基础知识

WRF理论第二期&#xff1a;运行模型的基础知识 1 Basics for Running the Model2 Geogrid程序2.1 Geogrid2.2 Terrestrial Input Data 3 Ungrid程序3.1 Ungrid3.2 Intermediate Files3.3 Required Fields 4 Metgrid程序参考 官方介绍-Basics for Running the Model 本博客主要…

调试线上资源文件失效问题

之前的老项目&#xff0c;突然报红&#xff0c;为了定位问题&#xff0c;使用注入和文件替换的方式进行问题定位&#xff01; 1.使用注入 但是刷新后就没有了&#xff0c;不是特别好用&#xff01; const jqScript document.createElement(script); jqScript.src https://…

【记录贴:分布式系列文章】

分布式系列文章目录 文章目录 分布式系列文章目录前言一、Redisq1.怎么判断是否命中缓存1. MySQL数据库如何检查询查缓存是否命中链接2.如何判断redis是否命中缓存链接 q2.Redis缓存穿透、雪崩、击穿以及分布式锁和本地锁 二、分布式q1.分布式订单号生成策略q2.接口幂等性,防止…