【編程二三事】ES究竟是個啥?

在最近的項目中,總是或多或少接觸到了搜索的能力。而在這些項目之中,或多或少都離不開一個中間件 - ElasticSearch。
今天忙里偷閑,就來好好了解下這個中間件是用來干什么的。

ES是什么?

? ES全稱ElasticSearch,是個基于Lucene的搜索服務器。其作為一個高度可拓展的開源全文搜索和分析引擎,可用于快速對大數據進行存儲,搜索和分析。

? ElasticSearch和Logstash(數據收集、日志解析引擎)、Kibana(分析和可視化平臺)一起開發的。這三個產品被設計成一個集成解決方案,稱為“Elastic Stack”(以前被稱為ELK技術棧)。

為什么要用ES?

傳統關系數據庫的缺陷

? 為了了解ES的優勢在哪,我們首先需要回顧傳統的mysql數據庫作為搜索的時候都有哪些缺陷。

在我們日常搜索的時候,我們都需要通過輸入關鍵詞,去檢索出來相關的數據。

以搜索“搜索引擎”為例子,你在百度、搜狗等搜索引擎中輸入這個關鍵字,就會得到一系列的搜索結果:

? 如果這些結果都存儲在Mysql數據庫中,它大致會呈現如下的存儲樣式:

? 每一行會存儲唯一標識id、數據內容。

因此,如果需要按照關系型數據庫的方式,需要逐行進行搜索匹配相關詞,甚至需要用上模糊搜索,如:‘LIKE %xx%’ 等。

? 且在mysql中,像這類模糊搜索語句,mysql是無法對其建立索引的。因此如果在大數據量下搜索將變得十分緩慢、困難。

? 而且另外一個點在于,對于搜索引擎來說,還需要將用戶輸入的詞做拆分,依舊是以”搜索引擎“為例子,那么搜索結果其實需要同時包含“搜索”、“引擎”、“搜索引擎”的結果,而這無疑又一次加大了采用關系型數據庫實現的復雜性。

? 總結下來,使用關系型數據庫處理搜索問題,主要有兩個較大的問題:模糊搜索困難、分詞查詢支持困難

? 那么為什么關系型數據庫會有這樣的問題呢?本質上是關系型數據庫的正排索引限制了其搜索性能。你可能這里會好奇了。什么是正排索引呀?

? 以上面的數據為例子,正排索引就是先找到對應的文章,而后才能夠知道每個文章中對應的詞是什么。繪制成圖片大概就是下面的樣子:

? 因此,如果用這樣正排索引的方式搜索,相當于每次都要進行全表的掃描、匹配,那么自然很難支持搜索的能力。

ElasticSearch優勢

倒排索引

? 上面我們總結了傳統數據庫實現搜索的主要難度在于:模糊搜索困難、分詞查詢困難

而其歸根結底是由于數據庫的組織方式是通過正排索引實現的。導致了每次搜索需要匹配的難度大。

? 那么,這里可能就有聰明的同學想到了,如果根據文章搜索詞的難度大,那么是否轉變一下存儲方式,先存詞,再存文章,不就可以一下子搜索到了嘛!

? 如果你想到了這個,那么恭喜你,你已經具備從零開始研發ES的潛力的。沒錯,ES為了支持快捷的搜索,底層的實現也是這么做的,而這種實現方法就是大名鼎鼎的----“倒排索引”

數據存儲結構

? 要更深入的了解ES的倒排索引的設計邏輯,我們可以先參照Mysql的數據存儲設計介紹幾個ES中的常見名詞:

Mysql等關系數據庫ElasticSearch數據庫
數據庫(dataBase)索引(index)
表(table)類型(type)
行(row)文檔(document)
列(column)字段(field)

? 結合同Mysql的定義對比,我們就不難理解如下的ES數據代表什么含義了:

{"took": 1,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation": "eq"},"max_score": 1.0,"hits": [{"_index": "china","_type": "_doc","_id": "beijing","_score": 1.0,"_source": {"name": "beijing"}}]}
}

? 像如上的數據,就是實際通過es查詢得到的數據。其中的__index就是代表所屬的數據索引; __type就是指所屬的的文檔類型,__id就是對應分詞出來的結果內容

? 那么我們現在已經知道了ES是如何存儲數據的,那么還有個問題:ES建立倒排索引的流程是怎樣的呢?這個說來也并不困難,主要有以下四步:

第一步,首先就是需要獲取文本數據,常見的方法就有網頁爬蟲、logstash搜集的方式。

第二步,等到數據收集完成以后,我們需要采用分詞器進行分詞。就是需要將咱們的文本數據拆分成多個細小的單詞,用于后續的倒排索引的建立。

第三步,就是生成倒排索引了。

第四步,就是將相關數據同步到集群中的其他節點上。

存在缺陷

? 那么說了這么多,ES就沒有缺點嗎?那當然也不是的,從上述的數據處理流程、處理原理來看,Es主要有兩個問題:

1、需要分詞,寫入存儲較慢。

2、需要建立的索引量大。

? 這兩種問題也不難理解。對于ES來說,一個文本存儲的方式寫入的時候需先分詞,拆分成多個詞才可以插入到索引中。而進行分詞的時候就會耗費較多的時間。

? 同時相比傳統的正排索引,原本只需要建立一個索引的文章,現在需要按照詞拆分后建立索引。因此創建出的數量就會比原本多得多。

?

ES的實際應用

? 上文介紹了ES的原理、優勢和劣勢。那么什么場景下會用到ES呢?其實最常見的場景就是日志實時分析

? 這是推動 ES 快速發展的場景,從官方統計數字、云上運營經驗看,占據了 ES 使用場景的 70%+。Elastic Stack 提供的完整日志解決方案,已經助力 ES 成為日志實時分析的開源首先方案。

? 簡單來說,日志實時分析主要有三個主要部分組成:logstash、ES集群、kibana。logstash負責收集各個業務系統的日志并推送到ES集群,ES將接收到的日志數據收集起來建立索引。kibana則是提供了一個可視化的搜索能力,用于支持運維人員進行相關報錯日志的搜索。

參考文獻

ES是什么?

Elasticsearch最新完整版教程通俗易懂,最適合后端編程人員的elasticsearch快速實戰教程_ES搜索引擎之核心技術+實戰教學

終于有人把Elasticsearch原理講透了!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/41100.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41100.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41100.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

性能優化的重要性

性能優化的重要性 性能優化的重要性摘要引言注意事項代碼示例及注釋性能優化的重要性 性能優化的重要性在 Java 中的體現響應速度資源利用效率擴展性與可維護性并發性能合理的鎖策略線程安全的數據結構并發工具類的應用避免競態條件和死鎖 總結代碼示例 博主 默語帶您 Go to Ne…

一張圖看懂 USDT三種類型地址 Omni、ERC20、TRC20的區別

USDT是當前實用最廣泛,市值最高的穩定幣,它是中心化的公司Tether發行的。在今年的4月17日之前,市場上存在著2種不同類型的USDT。4月17日又多了一種波場TRC20協議發行的USDT,它們各自有什么區別呢?哪個轉賬最快到賬?哪…

谷歌推出首款量子彈性 FIDO2 安全密鑰

谷歌在本周二宣布推出首個量子彈性 FIDO2 安全密鑰,作為其 OpenSK 安全密鑰計劃的一部分。 Elie Bursztein和Fabian Kaczmarczyck表示:這一開源硬件優化的實現采用了一種新穎的ECC/Dilithium混合簽名模式,它結合了ECC抵御標準攻擊的安全性和…

[LeetCode]矩陣對角線元素的和

解題 思路 1: 循環,找到主對角線的下標和副對角線的下標,如果矩陣長或寬為奇數的時候,需要減去中間公共的那一個值,中間公共的那個數的下標為mat[mat.size()/2][mat.size()/2]副對角線的下標為 mat [i][mat.size()-i-1] class Solution { public:int diagonalSum(vector<ve…

JVM中判定對象是否回收的的方法

引用計數法 引用計數法是一種垃圾回收&#xff08;Garbage Collection&#xff09;算法&#xff0c;用于自動管理內存中的對象。在引用計數法中&#xff0c;每個對象都有一個關聯的引用計數器&#xff0c;用于記錄對該對象的引用數量。 當一個新的引用指向對象時&#xff0c;…

Hive底層數據存儲格式

前言 在大數據領域,Hive是一種常用的數據倉庫工具,用于管理和處理大規模數據集。Hive底層支持多種數據存儲格式,這些格式對于數據存儲、查詢性能和壓縮效率等方面有不同的優缺點。本文將介紹Hive底層的三種主要數據存儲格式:文本文件格式、Parquet格式和ORC格式。 一、三…

SpringBoot復習:(42)WebServerCustomizer的customize方法是在哪里被調用的?

ServletWebServletAutoConfiguration類定義如下&#xff1a; 可以看到其中通過Import注解導入了其內部類BeanPostProcessorRegister。 BeanPostProcessor中定義的registerBeanDefinition方法會被Spring容器調用。 registerBeanDefinitions方法調用了RegistrySyntheticBeanIf…

解決vue3前端獲取文件的絕對路徑問題

解決vue3前端獲取文件的絕對路徑問題 公司的項目是基于vue3的&#xff0c;由于需求需要前端獲取用戶選的文件的絕對路徑。但是瀏覽器處于安全策略無法獲取真實的文件路徑&#xff0c;只能拿到相對路徑或者是D:\fakepath\xxxx. 看了網上很多方法都很坑&#xff0c;明明沒拿到路…

vue基礎-vue監聽當前屏幕大小做不同的操作

文章目錄 前言一、代碼如下&#xff1a;總結 前言 在vue項目開發過程中&#xff0c;有個需求&#xff0c;就是當屏幕大于1024時&#xff0c;我們默認為PC模式。小于1024時&#xff0c;我們默認為H5模式。但是有的界面我們想在PC和H5上面展示不同的數據&#xff0c;請求不同的接…

Intellij IDEA SBT依賴分析插件

可分析模塊和傳遞依賴 安裝完插件后&#xff0c;由于IDEA BUG&#xff0c;會出現兩個分析按鈕&#xff0c;一個是gradle的&#xff0c;一般是后者是新安裝的sbt。 選擇需要分析的模塊 只需要在project/plugins.sbt中添加代碼&#xff0c;啟動官方分析插件addDependencyTreeP…

1281. 整數的各位積和之差

諸神緘默不語-個人CSDN博文目錄 力扣刷題筆記 文章目錄 1. 簡單粗暴的遍歷2. 其實也是遍歷&#xff0c;但是用Python內置函數只用寫一行 1. 簡單粗暴的遍歷 Python版&#xff1a; class Solution:def subtractProductAndSum(self, n: int) -> int:he0ji1while n>1:last…

redis 數據結構(一)

Redis 為什么那么快 redis是一種內存數據庫&#xff0c;所有的操作都是在內存中進行的&#xff0c;還有一種重要原因是&#xff1a;它的數據結構的設計對數據進行增刪查改操作很高效。 redis的數據結構是什么 redis數據結構是對redis鍵值對值的數據類型的底層的實現&#xff0c…

WordToPDF2.java

用Java將Word轉PDF 本例子測試了spire.doc.free-3.9.0.jar的包 <dependency><groupId> e-iceblue </groupId><artifactId>spire.doc.free</artifactId><version>3.9.0</version></dependency> package word;import com.spire.…

Java 動態代理

文章目錄 靜態代理Jdk動態代理cglib動態代理使用案例低配Mybatis低配Feign攔截器 附錄代碼 大家好&#xff0c;我是入錯行的bug貓。&#xff08;http://blog.csdn.net/qq_41399429&#xff0c;謝絕轉載&#xff09; 每天進步一點&#xff0c;今日再接再勵~ 動態代理在Java中有著…

“深入探索JVM內部機制:解密Java虛擬機“

標題&#xff1a;深入探索JVM內部機制&#xff1a;解密Java虛擬機 摘要&#xff1a;本篇博客將深入剖析Java虛擬機&#xff08;JVM&#xff09;的內部機制&#xff0c;包括類加載、內存管理、垃圾回收、即時編譯等關鍵組成部分。通過對JVM內部機制的解密&#xff0c;我們可以更…

團團代碼生成器V1.0:一鍵生成完整的CRUD功能(提供Gitee源碼)

前言&#xff1a;在日常開發的中&#xff0c;經常會需要重復寫一些基礎的增刪改查接口&#xff0c;雖說不難&#xff0c;但是會耗費我們一些時間&#xff0c;所以我自己開發了一套純SpringBoot實現的代碼生成器&#xff0c;可以為我們生成單條數據的增刪改查&#xff0c;還可以…

中遠麒麟堡壘機 SQL注入漏洞復現

0x01 產品簡介 中遠麒麟依托自身強大的研發能力,豐富的行業經驗&#xff0c;自主研發了新一代軟硬件一體化統一安全運維平臺一-iAudit 統一安全運維平臺。該產品支持對企業運維人員在運維過程中進行統一身份認證、統一授權、統一審計、統一監控&#xff0c;消除了傳統運維過程中…

實現Python腳本錄制功能

要實現Python腳本錄制功能&#xff0c;可以使用Python的內置模塊pyautogui和opencv。 首先&#xff0c;需要安裝這兩個模塊&#xff1a; pip install pyautogui opencv-python 然后&#xff0c;可以編寫以下代碼來實現腳本錄制功能&#xff1a; import cv2 import numpy as …

CentOS7.6安裝配置MySQL 5.7及常用命令匯總

一、MySQL安裝&#xff08;rpm安裝&#xff09; 1、檢查沒有安裝過mysql或mariadb rpm -qa | grep -i mysql rpm -qa | grep -i mariadb 返回空值的話&#xff0c;就說明沒有安裝 MySQL。注意&#xff1a;在新版本的CentOS7中&#xff0c;默認的數據庫已更新為了Mariadb&#…

你需要需求管理解決方案的三個原因

我們最近研究了一份 Forrester Research 的報告&#xff0c;得出如下結論&#xff1a;高度監管的行業可以從敏捷需求管理方法中受益。在本文中&#xff0c;我們將深入探討所有行業的客戶如何從一個協作平臺中受益&#xff0c;該平臺如何幫助他們在復雜的開發周期中管理需求。 …