學習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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...