2个字段并在一次插入一个字段里面_elasticsearch外用与内观(二)-当插入文档时,elasticsearch都在做什么...

Previous: elasticsearch外用与内观(一)-常用功能与使用方法

在了解了es的基本用法之后,我们再来看看当插入文档数据时,elasticsearch都在做什么。

ffbfe97483a97dbe55e19a810ec2c7f0.png

首先,es的索引只是一个逻辑概念,实际上是由一个个物理分片组成的,每个分片就是一个lucene实例,我们看到这里有9个分片,也就是有9个lucene实例,所以每个分片都能独立完成搜索功能,最后由es对结果进行合并。
分片包括主分片shard和副本分片replica,副本分片仅仅是主分片的一个拷贝。
每个分片是分布在不同的节点上的,每启动一个es实例,就是一个节点:

57270e815a7a007d4877943d0c1ad6fb.png

我们看到这里启动了3个es实例,也就是有3个节点。

我们往es的索引里插入的文档,首先被插入到主分片里:

1359644e3ee774baa234c1f011f68ee2.png

因为每个文档只能属于一个主分片,而es默认给索引设置了5个主分片,我们这里画的是3个主分片,所以这些文档在插入的时候,就会散列存储到不同的主分片里,也就是存到lucne实例里, 而lucene实例的内部结构,又是由很多lucene索引组成:

0b7ee2c7852b25a1c05efb0da41b6d41.png

我们建的es索引里的每个字段,就是一个个lucene索引:

a20516508c02d216f7703a54888cec78.png

而lucene索引是由一个个segment组成的,每个segment大小是不一样的,有大有小:

73d9bd45b4c04b244d7b5f82993cdde9.png

每个segment就是一个包含了一些倒排索引的独立段:

63b23c26cc549f187a4e3094436deb62.png

所以,我们在往es插入数据后,最后创建了很多包含了倒排索引的segment段,而搜索的时候,也是从这些segment段里的倒排索引进行搜索的:

35ea63433a2fa1c3167e7f20d7716e84.png

我们看一下整体的示意图:

dc66fbfa764fb300c694672fc8a8c1d7.png

最外层的就是一个es索引,因为索引有很多分片,每个分片就是一个lucene实例, lucene实例里,由lucene索引构成,而每个es索引字段就是一个lucene索引,lucene索引里边由segment组成,每个segment里边就是一些倒排索引。

因为倒排索引是搜索引擎的核心,我们简单介绍一下倒排索引

倒排索引

07fe8df35dd54286e954a45ddef362e5.png

数据库里的正排索引是这样存储的,数据以id为主键,然后是名称字段。这样虽然通过id获取数据很快,但是通过名称搜索就很慢。
而倒排索引是以拆分好的分词作为主键,id放在后边。这样如果想用某个关键字获取数据,就可以直接找到对应数据的id,从而获取到数据。

es在插入数据的时候,除了会构建倒排索引这种存储结构之外,还会构建另外一种存储结构,doc values。
Doc values 只支持不需要分词的字段:

3fafdd4fa3b231f4339d65c29bb41884.png

也就是如果字段是text类型,那么就只有倒排索引,而其他类型除了有倒排索引,还会存一个doc values。

doc values大概的结构是这样的,和数据库的存储结构类似:

8d96bf74da4d2198c6077fd683bd70fd.png

为什么需要这种格式的数据,因为像聚合操作这种功能,需要使用某个字段来进行分类,这就需要知道这个字段里都有什么内容(包含哪些terms),而倒排索引是把一个字段的内容都打散了存储的,所以需要使用doc values这种类似数据库的存储结构,来进行聚合操作。

这也引出了一个我们需要关注的点,即:聚合操作的字段,不能设置为text类型,因为text类型,没有doc values。

Next: elasticsearch外用与内观(三)-当搜索时,elasticsearch都在做什么(上)

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

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

相关文章

学习Spring Data JPA

简介 Spring Data 是spring的一个子项目,在官网上是这样解释的: Spring Data 是为数据访问提供一种熟悉且一致的基于Spring的编程模型,同时仍然保留底层数据存储的特​​殊特性。它可以轻松使用数据访问技术,可以访问关系和非关系…

azure多功能成像好用吗_Azure持久功能简介:模式和最佳实践

azure多功能成像好用吗Authored with Steef-Jan Wiggers at Microsoft Azure由Microsoft Azure的Steef-Jan Wiggers撰写 With Durable Functions, you can program a workflow and instantiate tasks in sequential or parallel order, or you can build a watch or support a…

leetcode 327. 区间和的个数(treemap)

给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper。 区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。 说明: 最直观的算法复杂度是 O(n2) ,请在此…

常用的工具函数

得到两个数组的并集, 两个数组的元素为数值或字符串//tools.js export const getUnion (arr1, arr2) > {return Array.from(new Set([...arr1, ...arr2])) }//调用页面 import { getUnion } from /libs/toolsthis.getUnion getUnion([1,2,3,5],[1,4,6]) //(6) [1, 2, 3,…

git 常用commands(转)

常用 Git 命令清单 作者: 阮一峰 日期: 2015年12月 9日 我每天使用 Git ,但是很多命令记不住。 一般来说,日常使用只要记住下图6个命令,就可以了。但是熟练使用,恐怕要记住60~100个命令。 下面是…

Win2003磁盘分区调整

引用如下: 可能大家都知道,在Windows Server 2003下,普通版本的分区魔术师是无法运行的,而Windows内置的命令行工具Diskpart则能胜任分区魔术师的大部分工作,它的功能非常强大。输入Diskpart后,将显示如图所…

检查集群状态命令_轻松管理Kubernetes集群的7个工具

Kubernetes正在不断加快在云原生环境的应用,但如何以统一、安全的方式对运行于任何地方的Kubernetes集群进行管理面临着挑战,而有效的管理工具能够大大降低管理的难度。K9sk9s是基于终端的资源仪表板。它只有一个命令行界面。无论在Kubernetes仪表板Web …

leetcode 122. 买卖股票的最佳时机 II(贪心算法)

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉…

前端绘制绘制图表_绘制图表(第2页):JavaScript图表库的比较

前端绘制绘制图表by Mandi Cai蔡曼迪 绘制图表(第2页):JavaScript图表库的比较 (Charting the waters (pt. 2): a comparison of JavaScript charting libraries) 深入研究D3.js,Dygraphs,Chart.js和Google Charts (A deep dive into D3.js,…

python 3.6.5 pip_在Windows 10 + Python 3.6.5 中用 pip 安装最新版 TensorFlow v1.8 for GPU

声明什么cuDNN之类的安装,应该是毫无难度的,按照官网的教程来即可,除非。。。像我一样踩了狗屎运。咳咳,这些问题不是本文的关键。本文的关键是解决pip安装tensorflow gpu版的问题。安装环境操作系统:64位的Windows 10…

模板进阶——模板实参推断

一、关键点 模板实参:模板参数T的实例类型,如int、string等 模板实参推断:从函数实参来确定模板实参的过程 模板类型参数与类型转换:const的转换、数组/函数到指针的转换 显式模板实参:当模板参数类型并未出现在函数参…

leetcode 973. 最接近原点的 K 个点(排序)

我们有一个由平面上的点组成的列表 points。需要从中找出 K 个距离原点 (0, 0) 最近的点。 (这里,平面上两点之间的距离是欧几里德距离。) 你可以按任何顺序返回答案。除了点坐标的顺序之外,答案确保是唯一的。 示例 1&#xf…

ios 打开扬声器

[[UIDevice currentDevice] setProximityMonitoringEnabled:YES]; AVAudioSession *audioSession [AVAudioSession sharedInstance]; //默认情况下扬声器播放 [audioSession setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthe…

sqlserver 批量处理数据

目前我觉得有两种方法可以用作批量数据的处理,也算比较靠谱的吧:sqlbulkcopy 和利用表值函数。 1.sqlbulkcopy是dotnet中的一个用来处理大批量插入数据的,具体用法如下: using (SqlConnection conSave new SqlConnection(Config.…

区块链编程语言_区块链开发中使用的最受欢迎的编程语言

区块链编程语言by Michael Draper通过迈克尔德雷珀(Michael Draper) We’re currently in the midst of a new burgeoning industry with blockchain development.我们目前正处于区块链开发的新兴行业中。 Blockchain technology is very much in a nascent stage, however t…

vscode 模糊部分代码_本周 GitHub 速览:您的代码有声儿吗?(Vol.38)

作者:HelloGitHub-小鱼干摘要:还记得花式夸赞程序员的彩虹屁插件 vscode-rainbow-fart 吗?它后续有人啦!JazzIt 同它的前辈 vscode-rainbow-fart 一样,是一个能让代码“发声”的工具,它会在脚本运行成功或者…

有趣的链接

1行命令实现人脸识别:https://linux.cn/article-9003-1.html转载于:https://blog.51cto.com/10704527/1983007

webpack基础使用Loader(三)

loaders:[ { test:/\.js$/, loader:babel-loader, exclude:__dirname"/node_modules/", //排除打包的范围(需要绝对路径) include:__dirname"src",//指定打包的范围(需要绝对路径) query:{ …

Flutter VS React Native –为什么我认为Flutter最适合移动应用程序开发

This isn’t the type of article you might think it’s going to be. I’m not going to list the pros and cons of every framework and I am not going to do a comparative analysis of performance. 这不是您可能会想到的文章类型。 我不会列出每个框架的优缺点&#xf…

python 2.7 error: Microsoft Visual C++ 9.0 is required

参考:https://stackoverflow.com/questions/43645519/microsoft-visual-c-9-0-is-required 解决方法: 下载并安装Microsoft Visual C Compiler for Python 2.7: Microsoft Visual C Compiler for Python 2.7 转载于:https://www.cnblogs.com/…