學習Elasticsearch原理筆記

来源:https://www.cnblogs.com/gcixx/archive/2019/07/13/11179335.html
-Advertisement-
Play Games

Elasticsearch是一個分散式可拓展的實時搜索和分析引擎 文件存儲:Elasticsearch,面向文檔型資料庫,一條數據就是一個文檔,用JSON作為文檔序列化的格式 MySQL和Elasticsearch數據關係術語對比: 關係資料庫-資料庫-表-行-列 Elasticsearch-索引- ...


Elasticsearch是一個分散式可拓展的實時搜索和分析引擎

  分散式實時文件存儲,並將每一個欄位都編入索引,使其可以被搜索

  實時分析的分散式搜索引擎

  可以拓展到上百台伺服器,處理PB級別的結構化或非結構化數據

文件存儲:Elasticsearch,面向文檔型資料庫,一條數據就是一個文檔,用JSON作為文檔序列化的格式

MySQL和Elasticsearch數據關係術語對比:

  關係資料庫-資料庫-表-行-列

  Elasticsearch-索引-類型-文檔-欄位

Elasticsearch的交互:可以使用Java API,也可以直接使用HTTP的Restful API方式

Elasticsearch強大的索引能力:精髓-一切設計都是為了提高搜索的性能

什麼是倒排索引?舉個例子

| ID | Name | Age | Sex |

| - - |:-------:| -----:| -----:|

| 1 | Kate | 24 | Female

| 2 | John | 24 | Male

| 3 | Bill | 29 | Male

ID是Elasticsearch自建的文檔ID,Name、Age、Sex索引如下:

Name:| Term | Posting List |

   | -- |:----:|

   | Kate | 1 |

   | John | 2 |

   | Bill | 3 |

Age:| Term | Posting List |

  | -- |:----:|

  | 24 | [1,2] |

  | 29 | 3 |

Sex:| Term | Posting List |

  | -- |:----:|

  | Female | 1 |

  | Male | [2,3] |

Posting List

  Elasticsearch分別為每個field都建立了一個倒排索引,

  Kate ,24,Female,John,Male,Bill,29這些是Term。

  而1,2,3是文檔ID,[1][3][1,2][2,3]這些就是Posting List。

  Posting List就是一個int的數組,存儲了所有符合這個Term的文檔ID。

Term Dictionnary

  Elasticsearch將所有的Term排個序,二分法查找Term,logN的查找效率。

Term Index

  Term Index是Term Dictionnary的索引,包含的是Term的一些首碼。

Frame Of Reference

  Elasticsearch要求Posting List是有序的,方便壓縮。

  原理:通過增量,將原來的大數變成小數,僅儲存增量值,再按bit排好隊,最後通過位元組存儲。

Roaring Bitmaps

  Bitmap是一種數據結構,假設Posting List[1,3,4,7,10],對應的Bitmap就是[1,0,1,1,0,0,1,0,0,1],非常直觀,用0/1表示某個值是否存在。

  Bitmap的缺點是存儲空間隨著文檔個數線性增長。Roaring bitmaps需要用到某些指數特性:將posting list按照65535為界限分塊,用<商,餘數>的組合表示每一組id。

聯合索引

  如果多個field索引的聯合查詢,倒排索引如何滿足快速查詢的要求呢?

  利用跳錶的數據結構快速做”與“運算,或者利用bitset按位”與“。

Elasticsearch的索引思路:

  將磁碟里的東西儘量搬進記憶體,減少磁碟隨機讀取次數(同時也利用磁碟順序讀特性),結合各種壓縮演算法,用極其苛刻的態度使用記憶體。

所以,對於使用Elasticsearch進行索引時需要註意:

  不需要索引的欄位,一定要明確定義出來,因為預設是自動建索引的

  同樣的道理,對於String類型的欄位,不需要analysis的也需要明確定義出來,因為預設也是會analysis的

  選擇有規律的ID很重要,隨機性太大的ID(比如java的UUID)不利於查詢

關於最後一點,個人認為有多個因素:

  上面看到的壓縮演算法,都是對Posting list里的大量ID進行壓縮的,那如果ID是順序的,或者是有公共首碼等具有一定規律性的ID,壓縮比會比較高;

  最影響查詢性能的,應該是最後通過Posting list里的ID到磁碟中查找Document信息的那步,因為Elasticsearch是分Segment存儲的,Term定位到Segment的效率直接影響了最後查詢的性能,

  如果ID是有規律的,可以快速跳過不包含該ID的Segment,從而減少不必要的磁碟讀次數

 

 

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

-Advertisement-
Play Games
更多相關文章
  • 本文主要瞭解了Linux系統中的Shell,以及什麼是BATH。 ...
  • 普通文件類型 (-)Linux中最多的一種文件類型, 包括 純文本文件(ASCII);二進位文件(binary);數據格式的文件(data);各種壓縮文件.第一個屬性為 [-] ,這些文件一般是用一些相關的應用程式創建,比如圖像工具、文檔工具、歸檔工具... .... 或 cp工具等。這類文件的刪除 ...
  • [toc] linux軟體管理 RPM RPM的基礎概述 rpm:RPM全稱 縮寫,由紅帽開發用於軟體包的安裝,升級卸載與查詢 rpm包的命名規則 name: 軟體包名稱 version: 版本號, 主版本, 重大更新. 次版本, 子功能更新. 修訂號, 修複bug release: 發佈版本 el ...
  • [toc] 純凈版虛擬機 1. 先安裝個虛擬機,登陸nginx官網 http://nginx.org/選擇一個穩定的版本 2. 右鍵複製地址,到新克隆的純凈虛擬機wget 下載 先yum install y wget 把源換成阿裡雲的 curl o /etc/yum.repos.d/CentOS B ...
  • Linux目錄和文件——查詢目錄和文件的命令 摘要:本文主要學習了在Linux系統中是如何查詢目錄和文件的。 which命令 which命令是根據PATH環境變數設置的路徑,去搜索執行文件。 基本語法 選項說明 使用舉例 type命令 type命令用來顯示指定命令的類型: 1)alias:別名。 2 ...
  • crontab 簡介 ​ crontab常見於Unix和類Unix的操作系統之中,用於設置周期性被執行的指令。編輯好的crontab會被存放於“crontab”文件中,以供之後讀取和執行。每個用戶可以擁有自己的crontab文件。通常,crontab存儲的指令被守護進程crond激活,crond常常 ...
  • 前言 近期時間在努力投簡歷加找工作中,將自己或者朋友遇到的面試題在此一一整理,後期將持續更新。。。 (由於博主起步階段水平有限,接觸的都是基礎題目,大佬不要見笑) 1、測試網路連通性的命令 ping:最基礎的就不解釋了 tracent(trace router的縮寫):判斷數據包到目的地經過的哪些節 ...
  • Windows10安裝的時候,出現 大概提示為:windows 無法安裝所需的文件。請確保全裝所需的所有文件可用,並重新啟動安裝。 本人在出現這個問題的原因,是因為U盤的'文件系統格式'不正確,這裡給出我的步驟,希望能幫助到大家解決問題. 1. 合理的使用工具製作'啟動盤'(如:Rufus、Ultr ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...