elasticsearch的查询原理

数据结构

在 Elasticsearch 中,数据结构分布如下:

索引(Index)

  • 索引是 Elasticsearch 中存储数据的基本单元,相当于关系型数据库中的数据库。
  • 一个 Elasticsearch 集群中可以包含多个索引。

类型(Type) (从 Elasticsearch 7.0 开始已经被弃用):

  • 在较早版本的 Elasticsearch 中,一个索引可以包含多个类型。
  • 类型用于对索引中不同类型的数据进行逻辑分组。

文档(Document):

  • 文档是 Elasticsearch 中的基本数据单元,相当于关系型数据库中的行。
  • 每个文档都属于一个类型(Type),并存储在索引(Index)中。

字段(Field):

  • 字段是文档中的基本数据单元,相当于关系型数据库中的列。
  • 每个字段都有自己的数据类型,如字符串、数字、日期等。

分片(Shard):

  • 为了实现水平扩展,Elasticsearch 会将一个索引划分为多个分片。
  • 分片是 Elasticsearch 数据存储和处理的基本单位,每个分片都是一个独立的 Lucene 索引。

副本(Replica):

  • 为了提高可用性和容错性,Elasticsearch 支持为每个分片创建副本。
  • 副本分片是主分片的备份,当主分片失效时,可以切换到副本分片。

具体情况下,数据结构分布如下:

  • 当创建一个新的索引时,Elasticsearch 会根据配置将索引划分为多个分片,并为每个分片创建一个或多个副本。
  • 当写入新的文档时,Elasticsearch 会将文档存储到一个或多个分片中。
  • 当执行搜索查询时,Elasticsearch 会并行查询所有相关的分片,并将结果合并返回。
  • 随着数据量的增加,可以通过添加更多节点来水平扩展集群,Elasticsearch 会自动重新分配分片以实现负载均衡。

总之,Elasticsearch 的数据结构分布围绕着索引、分片和副本,通过这种分布式架构实现了高性能、高可用和可扩展的搜索和分析功能。

ElasticSearch的节点

在 Elasticsearch 中,节点是集群的基本组成单元。每个节点都是一个运行 Elasticsearch 进程的服务器实例。

节点有以下几种类型:

主节点(Master Node)

  • 主节点负责管理集群状态,如创建、删除索引,以及添加和删除节点等。
  • 集群中只有少数几个主节点,负责协调整个集群的操作。

数据节点(Data Node)

  • 数据节点负责存储数据、执行数据相关的操作,如文档的增删改查。
  • 数据节点通常会比主节点多,承担着大部分数据处理的工作。

协调节点(Coordinating Node)

  • 协调节点负责接收客户端的请求,并将请求路由到合适的数据节点进行处理。
  • 所有节点都可以充当协调节点,帮助分担请求负载。

热温冷分离(Hot-Warm-Cold Architecture)

  • 一种高级架构模式,将不同频率访问的数据存储在不同的硬件上。
  • 热数据存储在性能更好的硬件上,冷数据存储在性能较低但成本更低的硬盘上。

Elasticsearch 的查询原理

倒排索引

  • Elasticsearch 使用倒排索引作为核心的索引结构。
  • 对于每个文档中的每个词,倒排索引都会记录该词出现在哪些文档中,以及出现的频次。
  • 这种索引结构可以快速地根据词查找相关文档,是全文搜索的基础。

分片和复制:

  • 为了实现高可用和高性能,Elasticsearch 会将索引数据分散存储在多个分片上。
  • 每个分片都有一个主分片和零个或多个副本分片。
  • 查询时,Elasticsearch 会并行地在所有相关的分片上执行查询,最后合并结果。

评分模型:

  • Elasticsearch 使用 TF-IDF 评分模型来计算文档的相关度得分。
  • TF-IDF 考虑了词频(Term Frequency)和逆文档频率(Inverse Document Frequency)两个因素。
  • 词频越高,文档越相关;而在更多文档中出现的词,相关性越低。
  • 得分计算还会考虑文档长度、字段权重等因素。

查询 DSL:

  • Elasticsearch 提供了丰富的领域特定语言(DSL)来构建复杂的查询条件。
  • Query DSL 支持全文搜索、结构化查询、地理查询、聚合分析等功能。
  • 开发者可以灵活地组合不同的查询子句,实现复杂的查询逻辑。

查询执行过程:

当用户发起查询请求时,Elasticsearch 会经历以下步骤:

  • 解析查询 DSL,生成内部的查询计划。
  • 根据查询计划,确定需要查询的索引和分片。
  • 将查询任务并行地分发到相关的数据节点执行。
  • 数据节点使用倒排索引在本地分片上执行查询,并返回部分结果。
  • 协调节点收集并合并所有数据节点的部分结果,形成最终的查询结果。
  • 协调节点根据相关度得分对结果进行排序,并返回给客户端。

结果合并:

  • 当数据节点返回部分查询结果时,协调节点需要对这些结果进行合并和排序。
  • 合并过程需要处理不同数据节点返回的文档得分差异,确保最终结果的准确性。
  • 排序时,Elasticsearch 会根据文档的相关度得分进行排序,并返回给客户端。

总的来说,Elasticsearch 的查询原理依赖于倒排索引、分布式架构、评分模型等核心技术,为用户提供了高性能、高可扩展的搜索和分析能力。通过灵活的 Query DSL,开发者可以构建出复杂的查询逻辑,满足各种业务需求。

什么是倒排索引以及工作原理

正排索引vs.倒排索引

  • 正排索引是一种常见的索引结构,它将文档 ID 映射到文档内容。
  • 而倒排索引则相反,它将词语映射到包含该词语的文档 ID 列表。

倒排索引的组成

倒排索引由两个主要部分组成:

  • 词典(Lexicon): 存储所有唯一词语,并指向它们在倒排列表中的位置。
  • 倒排列表(Posting List): 记录每个词语出现在哪些文档中,以及出现的频次等信息。

倒排索引的构建过程

  • 首先,对文档集合进行分词,提取出所有的词语。
  • 然后,为每个唯一词语建立一个倒排列表,记录该词出现在哪些文档中。
  • 同时,还会记录该词在每个文档中出现的频次、位置等信息。

倒排索引的查询过程

  • 当用户进行查询时,Elasticsearch 会首先查找词典,找到查询词在倒排列表中的位置。
  • 然后,按照倒排列表中记录的文档 ID 列表,去获取这些文档的内容。
  • 最后,根据词频、文档长度等因素计算每个文档的相关度得分,并返回给用户。

倒排索引的优势

  • 倒排索引可以快速地根据词查找相关文档,是全文搜索的基础。
  • 相比正排索引,倒排索引可以更高效地执行全文检索查询。
  • 倒排索引支持词语级别的搜索,可以实现复杂的查询逻辑。

可视为一种二级索引

Elasticsearch 中的索引确实可以理解为一种二级索引。让我们更详细地解释一下:

索引的概念

  • 在 Elasticsearch 中,索引相当于关系型数据库中的表。
  • 索引用于存储和管理一类相似的文档数据。
  • 每个索引都有自己的映射(Mapping),定义了文档中各个字段的数据类型和分析行为。

倒排索引的关系

  • 每个 Elasticsearch 索引都有一个或多个倒排索引。
  • 倒排索引是 Elasticsearch 用于实现全文搜索的核心数据结构。
  • 它将文档中的词语映射到包含该词语的文档列表,大大提高了全文检索的效率。

二级索引的对比

  • 在关系型数据库中,我们常见的二级索引是在表的某些列上建立的索引。
  • 这种索引可以加快基于该列的查询速度,但仍需要扫描整个表。
  • 而 Elasticsearch 的倒排索引则更进一步,直接将词语与文档 ID 建立映射关系,无需扫描整个文档。

索引的优势

  • Elasticsearch 的索引不仅支持全文搜索,还可以进行结构化查询、地理查询等复杂操作。
  • 索引可以灵活地定义映射,支持动态添加新的字段,非常适用于schema-less的数据。
  • 索引可以水平扩展,通过增加节点来提升查询性能。

总之,Elasticsearch 中的索引确实可以视为一种二级索引,但它基于倒排索引的核心技术,在全文搜索等场景下展现出了更强大的性能和灵活性。这种索引结构是 Elasticsearch 高性能搜索和分析的关键所在。

类似于分表的分片

Elasticsearch 中的分片(Shard)确实类似于关系型数据库中的分表,它们都是为了提高系统的性能和可扩展性而采取的措施。让我们更详细地了解一下 Elasticsearch 中分片的作用和工作机制:

分片的概念

  • 在 Elasticsearch 中,每个索引都会被划分成一个或多个分片(Primary Shard)。
  • 这些分片可以分散在集群中的多个节点上,从而实现数据的分布式存储。
  • 除了主分片,每个索引还可以有零个或多个副本分片(Replica Shard),用于数据的冗余备份。

分片的作用

  • 提高查询性能:查询请求可以并行地在多个分片上执行,从而提高整体的查询效率。
  • 支持水平扩展:通过增加节点,可以增加分片的数量,从而支持更大规模的数据存储和查询。
  • 提高可靠性:副本分片可以提供数据冗余备份,增强系统的容错能力。

分片的工作机制

  • 当用户向 Elasticsearch 写入数据时,数据会被路由到对应的主分片上进行存储。
  • 同时,主分片的副本会被自动同步到其他节点上,形成副本分片。
  • 当用户查询时,查询请求会被并行地分发到所有相关的分片上执行,最后将结果汇总返回。

分片的灵活性

  • 分片数可以在创建索引时指定,也可以在索引创建后动态调整。
  • 分片数的选择需要权衡数据量、查询性能和容错性等因素。
  • 分片数过少可能导致单个分片过大,影响性能;分片数过多又可能造成资源浪费。

总之,Elasticsearch 中的分片机制确实类似于关系型数据库中的分表,都是为了提高系统的性能和可扩展性。分片在 Elasticsearch 中扮演了关键的角色,是实现海量数据高性能存储和检索的基础。

分片的

Elasticsearch 中,确定需要查询的分片位置是很关键的一步。Elasticsearch 提供了一些机制来帮助我们高效地定位查询的分片,主要包括以下几个方面:

路由算法

  • Elasticsearch 使用一个确定性的哈希路由算法来决定数据写入到哪个分片。
  • 该算法基于文档的 ID 值计算出一个分片编号,从而将文档路由到对应的分片上。

routing 参数

  • 在查询时,用户可以指定一个 routing 参数来自定义文档的路由方式。
  • 这样可以保证同一个查询请求会命中同一组分片,提高查询效率。

分片搜索

  • 当用户发起查询请求时,Elasticsearch 会自动将查询请求分发到相关的所有分片上执行。
  • 各个分片并行处理查询,最后将结果汇总返回给用户。

分片元数据

  • Elasticsearch 会维护每个索引的分片元数据信息,记录每个分片所在的节点等信息。
  • 当执行查询时,协调节点会根据这些元数据信息,将查询请求路由到正确的分片上。

分片感知

  • Elasticsearch 客户端库会缓存索引的分片元数据信息,减少与协调节点的交互。
  • 这样客户端就可以直接感知分片的位置信息,进一步提高查询效率。

并行处理的实现

Elasticsearch 中的并行处理是通过以下几个关键机制来实现的:

分片结构

  • 如前所述,Elasticsearch 会将索引数据划分成多个主分片和副本分片。
  • 这些分片可以分散存储在集群的不同节点上,从而为并行处理奠定基础。

查询路由

  • 当用户发起查询请求时,Elasticsearch 会根据路由算法将查询请求分发到相关的所有分片上。
  • 这种查询路由机制确保了查询可以并行地在多个分片上执行。

分片搜索

  • 各个分片会独立地处理查询请求,并返回部分结果。
  • Elasticsearch 的协调节点会收集这些部分结果,并进行最终的合并和排序输出。

线程池管理

  • Elasticsearch 在每个节点上都维护了多个线程池,用于处理不同类型的任务,如搜索、索引、bulk 等。
  • 这些线程池可以充分利用节点的CPU资源,提高并行处理能力。

节点协调

  • 当用户向 Elasticsearch 发起查询请求时,请求会先到达一个协调节点。
  • 协调节点会负责将请求分发到相关分片,收集分片结果,并将最终结果返回给用户。
    这种节点协调机制进一步优化了并行查询的过程。

资源隔离

  • Elasticsearch 会为不同类型的任务设置独立的资源池,如CPU、内存等。
  • 这种资源隔离机制确保了并行任务之间不会互相干扰,充分发挥集群的并行处理能力。

总的来说,Elasticsearch 的并行处理机制建立在分片结构、查询路由、线程池管理等多个层面。通过合理利用集群资源,Elasticsearch 可以高效地并行执行各种查询和索引任务,大大提高了系统的处理能力和性能

Java实现

Elasticsearch 是基于 Java 语言实现的。

具体来说:

Lucene 基础

  • Elasticsearch 的核心是基于 Apache Lucene 这个全文搜索引擎库。
  • Lucene 本身是用 Java 语言开发的高性能全文搜索库。

Elasticsearch 架构

  • Elasticsearch 是基于 Lucene 构建的一个分布式搜索和分析引擎。
  • Elasticsearch 的大部分核心组件和功能都是用 Java 语言实现的。

集群管理

  • Elasticsearch 的集群管理、节点通信、数据分片等核心机制也是用 Java 实现的。

查询处理

  • Elasticsearch 的查询解析、执行计划生成、结果合并等关键逻辑同样基于 Java 语言。

插件扩展

  • Elasticsearch 提供了丰富的插件机制,绝大部分官方插件也是用 Java 开发的。

客户端支持

  • Elasticsearch 官方提供了多种语言的客户端,如 Java、Python、C#、Node.js 等。
  • 这些客户端都是基于 Elasticsearch 的 Java API 进行二次封装。

总的来说,Elasticsearch 作为一个企业级的搜索引擎和分析平台,其核心实现和架构都是基于 Java 语言构建的。这得益于 Java 在企业级应用中的广泛应用,以及 Lucene 这个高性能全文搜索引擎库的 Java 语言基础。

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

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

相关文章

Mathematica训练课(46)-- 一些常用的画图函数

在前面的课程中,我们已经梳理了Plot的画图用法,今天就详细梳理一下其他的画图函数用法; 1. 画一条直线 2. Circle(圆) 3. Disk(圆盘) 4. 画出一个矩形 5. 箭头

c-前缀平方和序列(牛客小白月赛97)

题目&#xff1a; 假如一个长度为 n的正整数序列满足所有前缀和 都是平方数&#xff0c;那么称这种序列为前缀平方序列。 条件1<si<x 取模1e97 首先找出小于x的平方数有几个。 然后用二项式定理 算出小于x的平方数中取n个的种数。 #include<bits/stdc.h> using…

大数据可视化实验(六)——ECharts与pyecharts数据可视化

目录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 1、ECharts可视化制作.. 1 1&#xff09;使用ECharts绘制折线图显示一周的天气变换。... 1 2&#xff09;使用ECharts绘制柱状图显示商品销量的变化。... 4 2、pyecharts可视化制作.. 7 1&#xff09;使用…

beautifulSoup库

是什么? Beautiful Soup(简称BS4)是一种强大而灵活的HTML和XML解析库,广泛用于Python爬虫和数据采集中。相比正则表达式更加简洁. Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的…

【知识学习】Unity3D中Shader Graph的概念及使用方法示例

Unity3D中的Shader Graph是一个强大的可视化Shader编辑工具&#xff0c;它允许用户通过拖拽和连接节点的方式来创建Shader&#xff0c;而不是通过传统的编写代码的方式。Shader Graph使得Shader的创建过程更加直观和易于理解&#xff0c;特别是对于那些不熟悉Shader语言编程的美…

Java中的性能调优技巧与工具推荐

Java中的性能调优技巧与工具推荐 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨Java中的性能调优技巧与工具推荐。Java作为一门广泛应用的编程语…

【OpenREALM学习笔记:13】pose_estimation.cpp和pose_estimation.h

UML Class Diagram 图中红色框为头文件中所涉及到的函数、变量和结构体 核心函数 PoseEstimation::process() 其核心作用为执行位姿估计的处理流程&#xff0c;并返回是否在此循环中进行了任何处理。 在这个函数中判断并完成地理坐标的初始化或这地理坐标的更新。 这里需要…

QTreeView第一列自适应

通过setStretchLastSection(bool stretch)可以设置最后一列自适应,对于QTreeView,stretch默认为true。但有时候我们需要设置第一列自适应,比如文件浏览器,共有名称、大小和修改日期三列,大小和日期的宽度几乎是固定的,但名称却可长可短,此时我们希望在窗口大小变化时,第…

IDEA中Maven配置依赖和排除依赖

目录 依赖配置 添加依赖的几种方式&#xff1a; 1.利用中央仓库搜索的依赖坐标 2.利用IDEA工具搜索依赖 3.熟练上手maven后&#xff0c;快速导入依赖 排除依赖 依赖配置 依赖&#xff1a;指当前项目运行所需要的jar包。一个项目中可以引入多个依赖&#xff1a; 例如&am…

python r”, b”, u”, f” 前缀详解

1、r前缀 一般来说&#xff0c;\n’是一个换行符&#xff0c;是一个字符串&#xff1b;而加上r为前缀后&#xff0c;不会以任何特殊方式处理反斜杠。因此&#xff0c;r"\n" 是包含 ‘\’ 和 ‘n’ 的双字符字符串&#xff1b;示例如下&#xff1a; >>> pr…

Go-知识测试-工作机制

Go-知识测试-工作机制 生成test的maintest的main如何启动case单元测试 runTeststRunnertesting.T.Run 示例测试 runExamplesrunExampleprocessRunResult 性能测试 runBenchmarksrunNtesting.B.Run 在 Go 语言的源码中&#xff0c;go test 命令的实现主要在 src/cmd/go/internal…

Java面试题:解释反应式编程的概念,并讨论如何在Java中使用RxJava或Project Reactor实现

反应式编程&#xff08;Reactive Programming&#xff09;是一种基于异步数据流和变化传播的编程范式。它强调通过声明式编程来处理异步事件流和数据流&#xff0c;简化了复杂的异步操作和并发编程。反应式编程适用于处理异步事件、多线程处理、大量数据流、用户交互等场景。 …

零基础快速上手HarmonyOS ArkTS开发4---从简单的页面开始

接着上一次零基础快速上手HarmonyOS ArkTS开发3---应用程序框架的继续往下。 常用基础组件&#xff1a; 概述&#xff1a; 关于组件的一些基础概念就里就不多说了&#xff0c;官方有很详细的说明&#xff0c;而在HarmonyOS按功能分有如下几大类组件&#xff1a;基础组件、容…

springboot笔记示例八:yml文件数据库连接redis密码加密实现使用jasypt加密

springboot笔记示例八&#xff1a;yml文件数据库连接redis密码加密实现使用jasypt加密 本文md文件下载 https://download.csdn.net/download/a254939392/89496228点击下载本文md文件 说明 springboot中大多数配置我们都采用yml文件配置&#xff0c;比如数据库连接&#xff…

安卓短视频去水印v1.7 简洁好用

各大平台视频无水印提取&#xff0c;登录即永久会员&#xff01; 无水印提取&#xff0c;图片无水印提取 视频旋转&#xff0c;倒放&#xff0c;转gif等功能 链接&#xff1a;https://pan.baidu.com/s/1buoJmAvSFBiRkBmHc7Nn5w?pwd2fu4 提取码&#xff1a;2fu4

LeetCode-数值-No49字母异位词

题目&#xff1a; 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", &q…

Lr、LrC软件下载安装 Adobe Lightroom专业摄影后期处理软件安装包分享

Adobe Lightroom它不仅为摄影师们提供了一个强大的照片管理平台&#xff0c;更以其出色的后期处理功能&#xff0c;成为了摄影爱好者们争相追捧的必备工具。 在这款软件中&#xff0c;摄影师们可以轻松地管理自己的照片库&#xff0c;无论是按拍摄日期、主题还是其他自定义标签…

浅谈如何在linux上部署java环境

文章目录 一、部署环境1.1、JDK1.2、Tomcat1.3、MySQL 二、将自己写的的程序部署到云服务器上 一、部署环境 为了在linux上部署 Java web 程序&#xff0c;需要安装一下环境。 1.1、JDK 直接使用 yum 命令安装 openjdk。我们 windows系统上 下载的是 oracle 官方的 jdk。而 …

用Python将PowerPoint演示文稿转换到图片和SVG

PowerPoint演示文稿作为展示创意、分享知识和表达观点的重要工具&#xff0c;被广泛应用于教育、商务汇报及个人项目展示等领域。然而&#xff0c;面对不同的分享场景与接收者需求&#xff0c;有时需要我们将PPT内容以图片形式保存与传播。这样能够避免软件兼容性的限制&#x…

Cisco Identity Services Engine (ISE) 3.3 Patch 2 - 基于身份的网络访问控制和策略实施系统

Cisco Identity Services Engine (ISE) 3.3 Patch 2 - 基于身份的网络访问控制和策略实施系统 思科身份服务引擎 (ISE) - 下一代 NAC 解决方案 请访问原文链接&#xff1a;Cisco Identity Services Engine (ISE) 3.3 Patch 2 - 基于身份的网络访问控制和策略实施系统&#xf…