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.pswp.cn/news/392698.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392698.shtml
英文地址,請注明出處:http://en.pswp.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/…