Elasticsearch要点简记

news2024/12/26 13:25:49

Elasticsearch要点简记

  • 1、ES概述
  • 2、基础概念
      • (1)索引、文档、字段
      • (2)映射
      • (3)DSL
  • 3、架构原理
  • 4、索引字段的数据类型
  • 5、ES的三种分页方式
      • (1)深度分页(from+size)
      • (2)快照查询(scroll)
      • (3)search_after

1、ES概述

ES(elasticsearch)是一个分布式搜索和分析引擎,它用于快速、实时地搜索和分析大规模数据。ES是一个面向文档的分布式搜索引擎。它的数据模型基于文档,每个文档是一个包含了JSON格式数据的独立单元。文档可以属于不同的索引,每个文档可以具有不同的结构。

小记:

  • Elasticsearch提供了一个易于使用的RESTful
    API。可以使用HTTP请求来执行各种操作,例如索引文档、执行搜索查询、管理索引和节点等。
  • 专注于全文搜索和复杂查询,支持分词、模糊搜索、短语匹配等高级搜索功能。

2、基础概念

(1)索引、文档、字段

索引(Index):是Elasticsearch中的一个逻辑容器,用于组织和存储相关的文档数据。类似于关系数据库中的表。

文档(Document):文档是存储在索引中的基本数据单元,通常以JSON格式表示。每个文档代表了一个独立的数据记录。类似于关系数据库中的一行记录。

字段(Field):是文档中的数据项,它们包含了文档的具体信息。每个字段都有一个名称和一个对应的值。例如,一个产品文档可以包含字段如“productName”、“productDescription”、“price”等,每个字段存储相关信息。

一个索引可以包含多个文档,这些文档代表了不同类型的数据。每个文档包含多个字段,每个字段存储文档的具体数据。
在这里插入图片描述

(2)映射

映射(Mapping)用于定义索引中文档的结构和字段的属性。映射指定了每个字段的数据类型、如何分析文本、是否存储原始数据等信息。映射确保了索引中的文档被正确地存储和检索,并允许执行高级的搜索和分析操作。通常,映射可以自动创建,但在需要更精细的控制时,也可以手动定义映射。以下是关于映射的详细介绍:

字段的数据类型: 映射确定了每个字段的数据类型,例如文本、数值、日期、布尔值等。指定正确的数据类型有助于Elasticsearch正确地索引和搜索数据。

分析器(Analyzer): 对于文本字段,映射可以指定使用哪种分析器来处理文本数据。分析器决定了如何将文本拆分成词条,以及如何处理这些词条,例如小写化、删除停用词等。

日期格式: 对于日期字段,映射可以定义日期的格式,以确保正确的日期解析和排序。

(3)DSL

DSL(Domain-Specific Language 领域特定语言),它是一种用于构建和执行复杂查询的结构化查询语言。DSL是Elasticsearch查询的核心组成部分,用于与Elasticsearch进行交互,从而检索和操作数据。DSL查询通常以JSON(JavaScript Object Notation)格式编写,因此它是一种使用JSON语法的查询语言。

3、架构原理

主节点(Master Node): 负责集群的管理和协调,包括索引和分片的创建、删除、重新分配等。它还负责维护集群状态信息。

数据节点(Data Node): 负责存储索引数据和执行搜索操作。

协调节点(Coordinator Node): 不存储数据,但负责接收来自客户端的搜索和查询请求,然后将请求分发到适当的数据节点。

候选主节点(Candidate Master Node): 是潜在的主节点候选者,当主节点失败时可以自动接管主节点的角色。

ES架构

4、索引字段的数据类型

(1)keyword族

  • keyword: 用于结构化内容,如id、电子邮件地址、主机名、状态码、邮政编码或标签。

  • constant_keyword: 表示始终包含相同值(常量)的keyword字段。

  • wildcard: 用于机器生成的非结构化的内容。wildcard字段类型针对大值或高基数的字段进行了优化。

Keyword 字段经常用于结构化内容的查询,通常用于过滤、排序、聚合和 term-level queries。例如,id、电子邮件地址、主机名、状态码、邮政编码或标签等。

(2)text
最适合于非结构化的内容(全文索引),text字段不用于排序,也很少用于聚合,text字段会被分析(分词),也就是说,在建立索引之前,它们会通过分析器(分词器)将字符串转换为单个词的列表,例如,电子邮件的正文或产品的描述。

(3)数值类型
byte、short、integer、long、float、double、unsigned_long、half_float、scaled_float(一个使用long表示的浮点数,精度由一个换算系数决定,比如俩位小数,3.14 缩放因子是100的话,在文档中就存储314,取的时候除以100,表示金额时可以使用))

(4)日期类型
代表UNIX诞生的UTC时间1970年1月1日0时0分0秒。JSON没有日期数据类型,所以Elasticsearch中的日期可以是:格式化日期的字符串, 例如:“2015-01-01” or “2015/01/01 12:10:30”.

(5)布尔类型
布尔字段接受JSON的true和false值,但也可以接受被解释为true或false的字符串:

5、ES的三种分页方式

(1)深度分页(from+size)

默认采用的分页方式是 from+ size 的形式,即查询10-20条数据时,就在相应的各节点上直接查询前20条数据,然后截断前10条,只返回10-20的数据。

其中,from定义了目标数据的偏移值,size定义了返回的数据量(默认from为0,size为10),即所有的查询默认仅仅返回前10条数据。

GET /student/student/_search
{
  "query":{
    "match_all": {}
  },
  "from":100,
  "size":10
}

上面的查询意味着 es 需要在各个分片上匹配排序并得到110条数据,而随着页数增加,深度分页的效率将会非常低,因为我们只需要查询size条数据,而es则处理了from+size条数据。

(2)快照查询(scroll)

如果我们分页请求大数据集,scroll是一个好的解决方案。使用scroll滚动搜索,可以先搜索一批数据,然后下次再搜索一批数据,以此类推,直到搜索出全部的数据来。scroll搜索会在第一次搜索的时候,保存一个当时的视图快照,之后只会基于旧的视图快照提供数据搜索(如果这个期间数据变更,是不会让用户看到的)。每次发送scroll请求,我们需要指定一个scroll参数,指定一个时间窗口,每次搜索请求只要在这个时间窗口内能就可以了。

一个滚屏搜索允许我们做一个初始阶段搜索并且持续批量从Elasticsearch里拉取结果直到没有结果剩下。这有点像传统数据库里的cursors(游标)。

scroll的使用很简单。执行如下curl,每次请求两条。可以定制 scroll = 5m意味着该窗口过期时间为5分钟。

请求:

GET /student/student/_search?scroll=5m
{
  "query": {
    "match_all": {}
  },
  "size": 2
}

返回:

{
  "_scroll_id" : "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAC0YFmllUjV1QTIyU25XMHBTck1XNHpFWUEAAAAAAAAtGRZpZVI1dUEyMlNuVzBwU3JNVzR6RVlBAAAAAAAALRsWaWVSNXVBMjJTblcwcFNyTVc0ekVZQQAAAAAAAC0aFmllUjV1QTIyU25XMHBTck1XNHpFWUEAAAAAAAAtHBZpZVI1dUEyMlNuVzBwU3JNVzR6RVlB",
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 6,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "student",
        "_type" : "student",
        "_id" : "5",
        "_score" : 1.0,
        "_source" : {
          "name" : "fucheng",
          "age" : 23,
          "class" : "2-3"
        }
      },
      {
        "_index" : "student",
        "_type" : "student",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "name" : "xiaoming",
          "age" : 25,
          "class" : "2-1"
        }
      }
    ]
  }
}

返回信息里有一个重要的参数scroll_id(base64编码),在后面的请求参数中我们都要带着 scroll_id 。 student这个索引中共有6条数据,当我们使用 scroll 查询第4次的时候,返回结果为空。这时结果集就已经匹配完了。

(3)search_after

from + size的分页方式虽然是最灵活的分页方式,但是存在深度分页的问题。scroll能够解决深度分页的问题,但是其无法实现实时查询,即当scroll_id生成后无法查询到数据的变更,因为其底层原理是生成数据的快照。

search_after (es-5.x之后)是一种假分页方式,根据上一页的最后一条数据来确定下一页的位置,同时在分页请求的过程中,如果有索引数据的增删改查,这些变更也会实时的反映到游标上。为了找到每一页最后一条数据,每个文档必须有一个全局唯一值,官方推荐使用 _uid 作为全局唯一值,但是只要能表示其唯一性就可以。

在索引中增加一个uid字段表示其唯一性,请求如下:

GET /student/student/_search
{
  "query":{
    "match_all": {}
  },
  "size":2,
  "sort":[
    {
      "uid": "desc"
    }
  ]
}

结果:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 6,
    "max_score" : null,
    "hits" : [
      {
        "_index" : "student",
        "_type" : "student",
        "_id" : "6",
        "_score" : null,
        "_source" : {
          "uid" : 1006,
          "name" : "dehua",
          "age" : 27
        },
        "sort" : [
          1006
        ]
      },
      {
        "_index" : "student",
        "_type" : "student",
        "_id" : "5",
        "_score" : null,
        "_source" : {
          "uid" : 1005,
          "name" : "fucheng",
          "age" : 23
        },
        "sort" : [
          1005
        ]
      }
    ]
  }
}

下一次分页,需要将上述分页结果集的最后一条数据的值带上。

GET /student/student/_search
{
  "query":{
    "match_all": {}
  },
  "size":2,
  "search_after":[1005],
  "sort":[
    {
      "uid": "desc"
    }
  ]
}

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

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

相关文章

码随想录算法训练营第60天|卡码网:94. 城市间货物运输 I、95. 城市间货物运输 II、96. 城市间货物运输 III

1.卡码网:94. 城市间货物运输 I 题目链接:https://kamacoder.com/problempage.php?pid1152 文章链接:https://www.programmercarl.com/kamacoder/0094.城市间货物运输I-SPFA.html 思路: 只对 上一次松弛的时候更新过的节点作为出…

智能餐饮:Spring Boot 点餐系统

第四章 系统设计 4.1 系统体系结构 网上点餐系统的结构图4-1所示: 图4-1 系统结构 模块包括主界面,首页、个人中心、用户管理、美食店管理、美食分类管理、美食信息管理、美食订单管理、美食评价管理、系统管理等进行相应的操作。 登录系统结构图&…

2025年3月PMP考试《PMBOK®指南》第六版不再作为参考资料

大家都知道《PMBOK指南》第六版是PMP认证考试的必备教材,由项目管理协会(PMI)指定。本书详细介绍了项目管理的5个过程组,并对项目管理的10个知识领域进行了阐述。 就在2024.9.30昨天的时候中国国际人才交流基金会公布了&#xff…

崖山数据库的共享集群机制初探

本文作者:YashanDB高级服务工程师周国超 YashanDB共享集群是崖⼭数据库系统(YashanDB)的⼀个关键特性,它是⼀个单库多实例的多活数据库系统。⽤⼾可以连接到任意实例访问同⼀个数据库,多个数据库实例能够并发读写同⼀…

QT对QBytearray的data()指针进行结构体转换时会自动字节对齐填充

1、测试代码 #include <QCoreApplication>#pragma pack(push, 1) typedef struct {int a;float b;char c;int *d; }testStruct; #pragma pack(pop)#include <QByteArray> #include <QDebug>int main() {testStruct structA;structA.a 1;structA.b 2;struc…

正点原子阿波罗STM32F429IGT6移植zephyr rtos(二)---使用I2C驱动MPU6050

硬件平台&#xff1a;正点原子阿波罗STM32F429IGT6 zephyr版本&#xff1a;Zephyr version 3.7.99 开发环境&#xff1a;ubuntu 24.4 zephyr驱动开发与之前接触到的开发方式可能都不一样&#xff0c;更像是linux驱动开发&#xff0c;zephyr源码里边其实已经有写好的I2C和MPU60…

谷歌SEO:有心栽花花不开,无心插柳柳成荫!

之前一开始是想搞个谷歌SEO免费的技术教程博客&#xff08;https://www.c-sz.com/&#xff09;主要是很多时候遇到在谷歌独立站推广群里的朋友需要咨询和学习一些谷歌技术基础知识&#xff0c;当然我自己也有点小心思&#xff0c;就是希望在谷歌能吸引部分的谷歌SEO爱好者尤其包…

【AI学习】DDPM 无条件去噪扩散概率模型实现(pytorch)

这里主要使用pytorch实现基本的无条件去噪扩散模型&#xff0c;理论上面的推导这里不重点介绍。 原文理论参考&#xff1a; 前向和反向过程示意图 前向过程和后向过程 扩散过程包括正向过程和反向过程。前向过程是基于噪声调度的预定马尔可夫链。噪声表是一组方差 &#xff0…

uniapp小程序原始tabbar添加红点以及信息的方法

如图所示 很多人不知道在uniapp 小程序原始的tabbar上添加红点和红点内的信息有官方的api 从而用自定义的tabbar来做 虽然两种方法都能实现效果&#xff0c;但明显使用自带的更方便 还不如自定义

集合论(ZFC)之 序数(Ordinals) 注解

两个同构&#xff08;isomorphic&#xff09;的良序集&#xff08;Well-Ordered Set&#xff09;&#xff0c;拥有同样的序型&#xff08;Order-Type&#xff09;&#xff0c;那么序数&#xff08;Ordinal&#xff09;就是指良序集的序型&#xff08;Order-Type&#xff09;。 …

React 生命周期 - useEffect 介绍

在 React 中&#xff0c;useEffect 钩子可以被看作是函数组件中的一种副作用管理工具&#xff0c;它的行为可以模拟类组件中的不同生命周期方法。useEffect 的执行时机取决于其依赖项数组&#xff08;第二个参数&#xff09;的设置方式。 根据 useEffect 的使用方式&#xff0c…

在校大学生想从事网络安全工程师,来听听过来人的经验,你会少走很多弯路_学会大学的专业课之后可以去网络安全嘛

大家好&#xff01;一直以来都有一些大学生粉丝私信向我“取经”&#xff0c;看得出很多人对前路多多少少都有些迷茫。 因此&#xff0c;我将大家的问题整理了一下&#xff0c;主要有这几点&#xff1a; 1.国内网安工程师薪资水平&#xff1f; 2.网安行业真实前景&#xff1f;…

怎么提取视频里的音频?非常简单的提取音频方法

怎么提取视频里的音频&#xff1f;在现代数字媒体环境中&#xff0c;视频和音频的结合已成为信息传播和创作的重要手段。随着互联网的发展&#xff0c;视频内容日益丰富&#xff0c;从社交媒体短视频到在线课程&#xff0c;再到电影和纪录片&#xff0c;音频在这些内容中的角色…

全解析:如何评估PLM系统的性价比?

在当今竞争激烈的市场环境中&#xff0c;企业为了提升产品创新能力、优化生产流程、提高市场响应速度&#xff0c;纷纷引入PLM产品生命周期管理系统。然而&#xff0c;面对市场上琳琅满目的PLM系统&#xff0c;如何评估其性价比&#xff0c;成为企业决策的重要课题。本文将从多…

高清视频格式转换软件 豌豆狐 WonderFox HD Video Converter v27.7.0 中文授权版

WonderFox HD Video Converter Factory Pro 是一款来自国外团队开发的视频编辑和转换软件。它的强大之处在于支持数十种视频格式和设备专用格式之间的互相转换&#xff0c;甚至可以处理HD超清和4K极清视频&#xff01;开启显卡加速后&#xff0c;转换速度飞快&#xff0c;效率超…

LeetCode讲解篇之3. 无重复字符的最长子串

文章目录 题目描述题解思路代码实现 题目描述 题解思路 因为我们需要求无重复字符的最长子串&#xff0c;这个我们首先需要想到使用滑动窗口&#xff0c;窗口内记录无重复的子串的所有字符&#xff0c;移动窗口的右边界时&#xff0c;发现当前字符在窗口内已经出现&#xff0c…

【LeetCode】动态规划—120. 三角形最小路径和(附完整Python/C++代码)

动态规划—120. 三角形最小路径和 前言题目描述基本思路1. 问题定义2. 理解问题和递推关系3. 解决方法3.1 动态规划方法3.2 空间优化的动态规划 4. 进一步优化5. 小总结 代码实现PythonPython代码实现Python 代码解释 CC代码实现C 代码解释 总结: 前言 三角形最小路径和 是动态…

CHI协议中的LPID

总目录&#xff1a; CHI协议简读汇总-CSDN博客https://blog.csdn.net/zhangshangjie1/article/details/131877216 当某个requester包含多个logically separate processing agent时&#xff0c;使用这个LPID&#xff1b; LPID在如下的opcode下&#xff0c;取值需要正确&#…

无人机在抗洪方面的作用!

一、实时监测与灾情评估 无人机能够迅速抵达受灾区域上空&#xff0c;通过搭载的高清摄像头、红外热成像仪等传感器&#xff0c;实时传输灾区图像和视频&#xff0c;为救援指挥中心提供第一手资料。有助于快速了解灾情&#xff0c;从而制定科学合理的救援方案。 二、搜救定位…

SpringMVC源码-AbstractHandlerMethodMapping处理器映射器将@Controller修饰类方法存储到处理器映射器

SpringMVC九大内置组件之HandlerMapping处理器映射器-AbstractHandlerMethodMapping类以及子类RequestMappingHandlerMapping如何将Controller修饰的注解类以及类下被注解RequestMapping修饰的方法存储到处理器映射器中。 从RequestMappingHandlerMapping寻找: AbstractHandle…