七天进阶elasticsearch[two]

news2024/11/25 12:51:02

批量保存

批量保存是通过_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
}

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

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

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

相关文章

基于 MediaPipe 的 2D 和 3D 的人体姿态追踪:Rerun 展示

点击下方卡片,关注“小白玩转Python”公众号 概述 我们探讨一个使用 MediaPipe 在 2D 和 3D 中追踪人体姿态的用例。使这次探索更加有趣的是通过开源可视化工具 Rerun 提供的可视化功能,可以全方位展示人体姿态的动态。在这篇博文中,您将学习…

知识图谱的应用---智慧政务

文章目录 智慧政务典型应用 智慧政务 智慧政务即通过“互联网政务服务”构建智慧型政府,利用云计算、移动物联网、人工智能、数据挖掘、知识管理等技术,提高政府在办公、监管、服务、决策中的智能水平,形成高效、敏捷、公开、便民的新型政府&…

静态IP地址:多元化场景下的稳定连接解决方案

当考虑静态IP地址的适用场景时,我们可以从以下几个板块进行细分和归纳: 一、服务器托管与网络服务 1. 服务器托管 稳定性:静态IP确保服务器能够持续、稳定地接入互联网,减少因IP地址更新带来的服务中断风险。 可访问性&am…

java:reactor的Mono和Reactor的简单例子

【pom.xml】 <dependency><groupId>io.projectreactor</groupId><artifactId>reactor-core</artifactId><version>3.3.17.RELEASE</version> </dependency>【MyReactorTest2.java】 package com.chz.myReactor;import react…

基于 Delphi 的前后端分离:之三,使用 HTMX

# 前请提要 基于 Delphi 的前后端分离&#xff1a;之一_delphi 后台vue-CSDN博客 基于 Delphi 的前后端分离&#xff1a;之二_后端 框架 delphi-CSDN博客 # 发现一个非常好的前端框架 - HTMX 这里仍然使用之二里面提到的页面模板&#xff0c;但采用 HTMX 来和后端交互&#…

Redis持久化说明

Redis的持久化是指将内存中的数据持久化到磁盘中&#xff0c;以保证数据在重启或宕机后不会丢失。 Redis提供了两种主要的持久化方式&#xff1a;RDB(Redis DataBase)和AOF(Append Only File)。 RDB&#xff08;Redis DataBase&#xff09; 1、RDB快照原理 RDB持久化方式会定…

Django分页

1、在视图函数文件中引入‘分页器’ from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 2、给原来的罗列信息函数&#xff0c;添加分页功能&#xff0c;即按照页码&#xff0c;只返回部分信息。 login_required def article_list(request):article…

Facechain系列: constants.py文件解读

在根目录下还有个facechain目录&#xff0c;其中的constants.py文件中定义了代码控制的重要参数。 1.姿态控制 在应用代码进行推理&#xff08;见这里Facechain系列: 通过代码进行推理&#xff09;中&#xff0c;如果将以下代码 use_pose_model False 修改为 use_pose_mo…

ICLR2024佳作:多视图Transformer再次升级,直接感知三维几何信息

论文标题&#xff1a; GTA: A Geometry-Aware Attention Mechanism for Multi-View Transformers 论文作者&#xff1a; Takeru Miyato, Bernhard Jaeger, Max Welling, Andreas Geiger 导读&#xff1a; 本文提出一种几何感知注意力机制&#xff0c;替换Transformer中原有的…

用TuneFab下载Apple Music

Apple Music以出色的高保真音质流式传输歌曲已不是什么秘密&#xff0c;但用iTunes下载的离线音乐&#xff0c;采用了Apple的DRM&#xff08;数字版权管理&#xff09;技术&#xff0c;并不能在其他应用上播放&#xff0c;通过TuneFab软件&#xff0c;可以截获iTunes播放流&…

【vue3|第7期】 toRefs 与 toRef 的深入剖析

日期&#xff1a;2024年6月6日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xff…

FISCO BCOS助力郑州数据交易中心“碳账户”小程序上线

近年来&#xff0c;科技和数字化成为推进可持续绿色发展的关键词。在第53个世界环境日来临之际&#xff0c;由FISCO BCOS支持建设的郑州数据交易中心双碳数据服务专区迎来了新进展&#xff01;近日&#xff0c;专区正式以"碳账户"小程序对外提供多种形式的碳数据服务…

我国衡器市场规模逐渐扩大 出口量远大于进口量

我国衡器市场规模逐渐扩大 出口量远大于进口量 衡器是利用力的杠杆平衡原理或胡克定律来测定物体质量的一种仪器设备。随着生产技术逐渐进步&#xff0c;衡器的种类逐渐增多。根据衡量方法不同&#xff0c;衡器大致可分为非自动衡器、自动衡器等&#xff1b;根据结构原理不同&a…

RE_TEA加密

TEA这段时间遇到的是真多&#xff0c;有直接原始加密&#xff0c;也有 XTEA&#xff0c;XXTEA&#xff0c;更有在此上魔改的&#xff0c;之前也是能认出来&#xff0c;知道还是不够。 en,TEA加密解密脚本还是用 C 好一些&#xff0c;什么溢出之类不用考虑。 TEA 也有可能是 …

JimuReport 积木报表 v1.7.5 版本发布,免费的低代码报表

项目介绍 一款免费的数据可视化报表工具&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完…

Java Web学习笔记13——JSON

JavaScript自定义对象 定义格式&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Js-对…

(求一个整数各位数的和)编写程序,读取一个在0和1000之间的整数,并将该整数的各位数字相加。例如:整数是 932,各位数字之和为14。

(求一个整数各位数的和)编写程序&#xff0c;读取一个在0和1000之间的整数&#xff0c;并将该整数 的各位数字相加。例如:整数是 932&#xff0c;各位数字之和为14。 提示:利用操作符%分解数字,然后使用操作符/去掉分解出来的数字。例如: 932%10-2 932/10-93。下面是一个运行示…

如何使用Python提取Excel中固定单元格的内容

正文共&#xff1a;1234 字 31 图&#xff0c;预估阅读时间&#xff1a;1 分钟 之前转载了颜总的Python环境搭建文章&#xff08;Python办公自动化—环境搭建&#xff09;&#xff0c;很久过去了&#xff0c;颜总也没有再更新。现在我有一个需求&#xff0c;就是我手上有大量格…

利用医学Twitter进行病理图像分析的视觉-语言基础模型| 文献速递-视觉通用模型与疾病诊断

Title 题目 A visual–language foundation model for pathology image analysis using medical Twitter 利用医学Twitter进行病理图像分析的视觉-语言基础模型 01 文献速递介绍 缺乏公开可用的医学图像标注是计算研究和教育创新的一个重要障碍。同时&#xff0c;许多医生…

HEXO博客常用命令(自用)

1、配置类命令 预览命令 hexo s 上传本地仓库&#xff1a; hexo g提交&#xff1a; hexo d更换主题&#xff1a;在_config.yml文件中&#xff1a;注意属性后面要跟着 # Extensions ## Plugins: https://hexo.io/plugins/ ## Themes: https://hexo.io/themes/ theme: vola…