Elasticserach學習筆記(一)

来源:https://www.cnblogs.com/yuxl01/archive/2022/05/05/16200755.html
-Advertisement-
Play Games

1.什麼是Elasticserach? 一個由Java語言開發的全文搜索引擎,全文檢索就是根據用戶輸入查詢字元的片段,能查詢出包含片段的數據,簡單來說就是一個分散式的搜索與分析引擎,它可以完成分散式部署,結構化檢索,以及數據分析功能,主要是應用在微服務系統中。 我們使用大白話簡單的形式解釋,舉個例子 ...


1.什麼是Elasticserach?

一個由Java語言開發的全文搜索引擎,全文檢索就是根據用戶輸入查詢字元的片段,能查詢出包含片段的數據,簡單來說就是一個分散式的搜索與分析引擎,它可以完成分散式部署,結構化檢索,以及數據分析功能,主要是應用在微服務系統中。

我們使用大白話簡單的形式解釋,舉個例子,例如我們HR下發漲薪公告“今年統一漲工資,真的666666翻了”這段字元串存在資料庫中,我們還有很多其他的公告,我們想快速找到關於漲工資的信息,我們在客戶端輸入"漲工資"或者"真翻了"系統能查詢出來這一整段話,或者類似的字元串,如果你還覺得不夠形象,相信使用過谷歌吧,你在谷歌輸入隨意你感興趣的關鍵字,都會給你搜索到相關信息,這個就是全文檢索。

2.Elasticserach的全局設計

我們需要從Elasticserach中查詢數據,必須先將微服務系統的數據,同步到Elasticserach中,使它介於系統和資料庫之間,作為一個緩衝區,用作對高併發全文檢索查詢提供支持,當然最主要的是可以利用它的全文檢索和數據分析功能,按照上面介紹的業務場景,如果你有相關需求,你不想每次的查詢都是直接去資料庫中模糊匹配吧,這樣做先不說設計是否正確,最起碼模糊查詢的性能是極低的,遇到併發量高直接對資料庫是致命的威脅,所以選擇合適的技術做合適的事。

1.寫入數據方式

首先先看下麵的圖,在腦海中對寫入數據到Elasticserach的過程有個簡單的理解,然後再分析Elasticserach本身如何存儲數據的

es-write-2-CW97xV

我們看到圖片有幾個關鍵字DocumentIn-memory buffercache、以及segment 這幾部分正是組成Elasticserach寫入數據流程的核心內容,那麼我們來解析一下大致流程如下:

  1. Elasticserach首先不斷的將數據Document 寫入到 In-memory buffer
  2. 當滿足一定條件後In-memory buffer中的 Documents 會刷新到cache,預設是一秒鐘一次,所以新寫入的 Document 最慢 1 秒就可以在 cache 中被搜索到
  3. cache中生成新的segment,這時候還沒有寫入磁碟,但是已經可以被讀取了
  4. cache將數據非同步寫入到磁碟
2.如何防止數據丟失

我們簡單的分析了上面的步驟,知道了cache存儲了供客戶端寫入和查詢數據的支撐,但是弊端必然存在,如果緩存cache宕機數據就會丟失 ,所以為了防止數據丟失,就採用持久化的策略,將數據非同步(fsync)寫入到磁碟 中。

其實 Document在寫入數據到In-memory buffer 時,此時Elasticserach會追加translog, 每隔 5s 會 fsync 到磁碟,當translog 累加變得越來越大,大到一定程度或者每隔一段時間,Elasticserach會執行 flush。

一般translog 5s 刷新一次磁碟,所以故障重啟,可能會丟失 5s 的數據,可以通過配置文件來配置縮短寫入磁碟的周期,translog 預設 30 分鐘或者當數據太大,達到2G左右,會執行執行 flush 操作。

3.數據結構設計

在Elasticserach中有幾個比較核心的概念

  1. Dcoument就是數據在ES中的一種表現形式,以Json的格式存儲 。
  2. Index(資料庫)用於Document存儲,數據在Elasticserach中的是以2進位的格式存儲到一個個尾碼為.fdt的文檔中。
  3. Index(查詢)表示文檔 的索引,我們的Index索引是存儲在尾碼為.fdx的文檔中,索引文件預設 是以Elasticserach的文檔ID生成

通常Elasticserach接收到存儲數據請求,首先會生成 一個索引fdx文件,然後再把具體數據存儲到fdt文件中,索引和文檔一一對應的關係 ,查找時根據索引快速找到文檔數據,我們將這種關係稱之為正排索引

但是存在一些影響性能的問題 ,如果有成千上萬的數據,要查詢某個文檔數據,就需要去迴圈找出對應的文檔數據,隨著數據量增大,對性能的損耗是相當嚴重的,所以就需要使用 倒排索引,,倒排索引指的是將文檔內容中的單詞作為索引,將包含該詞的文檔 ID 作為記錄的結構。

3.搜索數據的原理
1.分詞概念

在去分析 倒排索引之前我們需要瞭解什麼是分詞,簡單的解釋就是將一段話可能分為不同的關鍵詞或關鍵字 ,也許你會好奇它是如何通過某種規則分詞的,其實在全文檢索中如何分詞與分詞器是密切相關的 ,後面我們會單獨學習分詞 。下麵示例簡單說明分詞:

title:"搜索數據的原理";

//分詞之後 
搜索
數據 
原理
搜索數據 
數據的原理
2.倒排索引生成過程

我們通過一個簡單的例子來說明倒排索引的生成過程,假設目前有2條數據

message:今年統一漲工資,真的666666翻了;
message:老闆說,今年統一不漲工資;

1.正排索引會給 每一個Document進行 編號,作為 唯一標識

文檔 id 內容
1 今年統一漲工資,真的666666翻了
2 老闆說 ,今年統一不漲工資

2.生成倒排索引首先會對 欄位內容進行分詞,例如2個 Document包含 6統一工資漲工資老闆這些關鍵字。然後 按照關鍵詞 來作為 索引,對應 文檔的id建立鏈表,就能構成 倒排索引,有了倒排索引,就能快速、靈活地實現各類搜索需求。整個搜索過程中我們不需要做任何文本的模糊匹配。

6 1
統一 1,2
漲工資 1,2
老闆 2

3.例如需要查詢 “漲工資老闆說”,通過 詞倒排首先查詢到文檔 id 1,2,再通過“老闆”找到文檔id 2,然後 取交集 得到 id為2的 文檔

4.我們在使用倒排索引,其中分詞得到的單詞是利用一個Term Dictionary的概念來存儲的,一個分詞就是一個 Term,它在文件中的變現形式是存儲在尾碼為.tim的文檔中,而文檔id是存儲在Postings List的集合中,對應穩健表現形式是存儲在尾碼為.doc的文件中

5.此時我們應該考慮,按照這樣存儲,文檔和分詞的關係是1>N的 ,也就是說一個文檔對應多個分詞,例如1000條文檔,可能對應2000條分詞,甚至更多,取決於文檔大小和分詞精度,那我們在對大量的分詞進行查找時,Cpu會將這些Term從磁碟載入到記憶體,由於磁碟預讀一次最多載入4M大小數據,所以會分段載入多次,此時如果我只需要查詢2個單詞 ,是不是也要將所有的Term載入到記憶體呢 ,顯然這樣做是非常浪費性能的,那該如何解決呢?

6.其實Elasticserach為瞭解決上述問題,提高查詢Term的效率 ,會在Term Dictionary之上再抽象出一層索引(Index)的策略,將Term索引文件存儲,它在文件中表現形式存儲在一個尾碼為.tip的文件中,查詢時根據索引找到Term單詞,然後載入到記憶體中,在找到文檔id,直到最終找到文檔。

4.聚合場景

首先我們要知道什麼是聚合,根據Google上說的聚合在信息科學中是指對有關的數據進行內容挑選、分析、歸類,最後分析得到人們想要的結果,說白了就是做統計
其實Elasticserach為瞭解決提高統計的效率和性能,在對數據統計存儲方面做了一些對應的設計策略,我們知道在關係型資料庫中,數據存儲是以為單位存儲,而Elasticserach採用的是式存儲,列式存儲有利於做聚合操作,我們書面化稱為doc_values

doc_values欄位文件在實際文件中存儲表現形式是以.fnm尾碼文件存儲,而doc_values值文件是以.tmd尾碼文件存儲


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這個問題老生常談了,大部分互聯網公司的項目都可能會遇到這樣的問題,這裡並不能給到大家一個具體的、徹底的、完美的解決方案,具體的項目、團隊情況需要具體的分析,我這裡記錄一下遇到這種問題時候的一些思考和處理方式吧。 團隊情況 來到新的公司後,擔任XX項目開發組長,主管先讓我帶5個人的團隊:2個前端、2個 ...
  • 需求 要求開發一個hello.go程式,可以輸出helloworld 開發的步驟 (1)開發這個程式/項目時,go的目錄結構怎麼處理 (2)代碼如下: ```go package main import "fmt" func main() { fmt.Println("hello,world") } ...
  • 前言 利用Python製作遠程查看別人電腦的操作記錄,與其它教程類似,都是通過郵件返回。 利用程式得到目標電腦瀏覽器當中的訪問記錄,生產一個文本併發送到你自己的郵箱,當然這個整個過程除了你把python程式植 入目標電腦外,其它的操作都是自動化的。 我知道我說到這些,有些人又開始有其它的想法了,可別 ...
  • #volatile關鍵字 ##什麼是可見性? 可見性是指線程A改變變數的值後,線程B可以馬上看到更改後變數的值 ##volatile的作用 關鍵字volatile提示線程每次從共用記憶體中讀取數據,而不是從私有記憶體中讀取,這樣就保證了同步數據的可見性 ##關鍵字volatile適用的場景 當想實現一個 ...
  • HandlerInterceptor源碼 ##3種方法: preHandle:攔截於請求剛進入時,進行判斷,需要boolean返回值,如果返回true將繼續執行,如果返回false,將不進行執行。一般用於登錄校驗。 postHandle:攔截於方法成功返回後,視圖渲染前,可以對modelAndVie ...
  • 在文章的開頭,先說下NPE問題,NPE問題就是,我們在開發中經常碰到的NullPointerException.假設我們有兩個類,他們的UML類圖如下圖所示 在這種情況下,有如下代碼 user.getAddress().getProvince(); 這種寫法,在user為null時,是有可能報Nul ...
  • 前言 大家都喜歡搞笑視頻倒放吧,視頻倒放會給人不一樣的感覺,比起按照原本的劇本,倒放的效果給人的感覺更出乎意料。所以, 我就想可不可以用Python實現視頻或者圖片倒放呢?於是,我做到了,我想把它分享給大家,讓大家跟我一起玩。 開始分享今天的技術之前,先來看幾個動圖(gif) (原圖1) (倒放1) ...
  • 寫文件有三種模式: 截斷寫,文件打開之後立即清空原有內容 附加寫,文件打開之後不清空原有內容,每次只能在文件最後寫入 覆蓋寫,文件打開之後不清空原有內容,可以在文件任意位置寫入 例如:文件原有內容為 123456,在開始位置覆蓋寫入 abcd,最後文件內容為 abcd56。首先使用下麵的代碼進行嘗試 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:本文代碼示例演示瞭如何在WPF中使用LiveCharts庫創建動態條形圖。通過創建數據模型、ViewModel和在XAML中使用`CartesianChart`控制項,你可以輕鬆實現圖表的數據綁定和動態更新。我將通過清晰的步驟指南包括詳細的中文註釋,幫助你快速理解並應用這一功能。 先上效果: 在 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • 概述:本示例演示了在WPF應用程式中實現多語言支持的詳細步驟。通過資源字典和數據綁定,以及使用語言管理器類,應用程式能夠在運行時動態切換語言。這種方法使得多語言支持更加靈活,便於維護,同時提供清晰的代碼結構。 在WPF中實現多語言的一種常見方法是使用資源字典和數據綁定。以下是一個詳細的步驟和示例源代 ...
  • 描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
  • 1、AOT適合場景 Aot適合工具類型的項目使用,優點禁止反編 ,第一次啟動快,業務型項目或者反射多的項目不適合用AOT AOT更新記錄: 實實在在經過實踐的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和非同步方法 5.1.4.129-preview1 ...
  • 總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
  • 目錄條款17:讓介面容易被正確使用,不易被誤用(Make interfaces easy to use correctly and hard to use incorrectly)限制類型和值規定能做和不能做的事提供行為一致的介面條款19:設計class猶如設計type(Treat class de ...
  • title: 從零開始:Django項目的創建與配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 後端開發 tags: Django WebDev Python ORM Security Deployment Op ...
  • 1、BOM對象 BOM:Broswer object model,即瀏覽器提供我們開發者在javascript用於操作瀏覽器的對象。 1.1、window對象 視窗方法 // BOM Browser object model 瀏覽器對象模型 // js中最大的一個對象.整個瀏覽器視窗出現的所有東西都 ...