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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...