在大資料量下提高查詢效率的方法—ES搜尋引擎

博為峰網校發表於2022-03-25

我們在開發測試過程中是不是常常會因為查詢效率低下而感到苦惱? 加我VX:atstudy-js 回覆“測試”,進入 自動化測試學習交流群~~

把資料都存在資料庫中,通過建立索引可以提高資料查詢效率,但是如果我們查詢的資料索引無法生效,資料庫一條一條的判斷效率又得不到提升。

這裡我們給大家介紹一種能夠在大資料量下提高查詢效率的方法ES(elasticsearch)搜尋引擎,接下來我們從什麼是搜尋、普通搜尋面臨的問題和ES如何解決這些問題這幾個方面,讓大家快速理解ES搜尋引擎。

什麼是搜尋

簡單的說搜尋就是我們在搜尋框輸入關鍵詞,查詢哪些網頁包含對應的關鍵詞的過程。

例如:使用者在搜尋框輸入一個詞,客戶端軟體傳送一個請求到後臺,後臺通過sql語句從資料庫中找出相關條目(資料庫會一條一條對比),這就是一個最簡單搜尋原型。

普通搜尋面臨的問題

1、當網頁很多時,假如1000萬個網頁呢,即使伺服器的效能足夠快,從使用者角度,從點選搜尋按鈕到看到搜尋結果可能要很長時間,1小時?2小時?甚至好幾天?

2、當資料量達到幾十T,一臺伺服器已經放不下了,這時候就需要多臺,這就是分散式。

這時候資料就在不同的伺服器了,一個客戶端不可能去請求每臺機器,所以就需要一個管理員角色,負責把客戶端請求分發到每臺機器,同時彙總結果返回給客戶端。

ES搜尋引擎如何解決這些問題

建立倒排索引

正向的查詢資料需要消耗大量的時間,我們可否反過來進行存儲存呢,現在我們有很多網頁,如何才能快速的查到對應的網頁呢?

我們知道雜湊表的查詢效率特別快,借鑑一下雜湊表,我們給每個網頁都打上標籤,每個標籤和對應的網頁建立對應的對映,我們通過標籤與網頁的對映關係就可以馬上找到對應的網頁了。

首先把所有的原始資料進行編號,形成文件列表如圖1:

圖1 原始資料進行編號

其次,把文件資料進行分詞,得到很多的詞條,以詞條為索引。

儲存包含這些詞條的文件的編號資訊,如圖2:

圖2 分詞與原始資料對應關係

當使用者輸入任意的詞條時,首先對使用者輸入的資料進行分詞,得到使用者要搜尋的所有詞條,然後拿著這些詞條去倒排索引列表中進行匹配。找到這些詞條就能找到包含這些詞條的所有文件的編號。

分散式的實現

Elasticsearch 也是會對資料進行切分,同時每一個分片會儲存多個副本,其原因是為了保證分散式環境下的高可用。

在 ES中,節點是對等的,節點間會通過自己的一些規則選取叢集的 Master,Master 會負責叢集狀態資訊的改變,並同步給其他節點。

值得注意的是,只有建立索引和型別需要經過 Master,資料的寫入有一個簡單的 Routing 規則,可以 Route 到叢集中的任意節點,所以資料寫入壓力是分散在整個叢集的。

Elasticsearch 建立一個索引,這個索引可以拆分成多個 shard,每個 shard 儲存部分資料。

這個shard 的資料實際是有多個備份,就是說每個 shard 都有一個 primary shard,負責寫入資料,但是還有幾個 replica shard。

primary shard 寫入資料之後,會將資料同步到其他幾個 replica shard 上去,如圖3,通過這個 replica 的方案,每個 shard 的資料都有多個備份,如果某個機器當機了,還有別的資料副本在別的機器上。

圖3分散式搜尋引擎架構圖

總結

本文從什麼是搜尋、普通搜尋面臨的問題和ES如何解決這些問題這幾個方面,讓大家快速理解ES搜尋引擎。

ES通過倒排索引提高了大資料下的資料查詢效率,通過分散式的方式實現了大資料的儲存與系統的高可用,採用ES搜尋引擎可滿足大資料量下的資料查詢場景,利用現有的框架可極大地縮小開發成本,提升使用者的使用體驗。

最後:

可以我的個人V:atstudy-js,可以免費領取一份10G軟體測試工程師面試寶典文件資料。以及相對應的視訊學習教程免費分享!,其中包括了有基礎知識、Linux必備、Mysql資料庫、抓包工具、介面測試工具、測試進階-Python程式設計、Web自動化測試、APP自動化測試、介面自動化測試、測試高階持續整合、測試架構開發測試框架、效能測試等。

這些測試資料,對於做【軟體測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31407649/viewspace-2884118/,如需轉載,請註明出處,否則將追究法律責任。

相關文章