# 1、概述 ## 功能 Elasticsearch 是一個分散式的 RESTful 搜索和分析引擎,可用來集中存儲您的數據,以便您對形形色色、規模不一的數據進行搜索、索引和分析。 例如: - 在電商網站搜索商品 ![image](https://img2023.cnblogs.com/blog/3 ...
1、概述
功能
Elasticsearch 是一個分散式的 RESTful 搜索和分析引擎,可用來集中存儲您的數據,以便您對形形色色、規模不一的數據進行搜索、索引和分析。
例如:
- 在電商網站搜索商品
- ELK技術棧
發展歷程
elasticsearch底層是基於lucene來實現的。
Lucene是一個Java語言的搜索引擎類庫,是Apache公司的頂級項目,由DougCutting於1999年研發。官網地址:https://lucene.apache.org/ 。
elasticsearch的發展歷史:
- 2004年Shay Banon基於Lucene開發了Compass
- 2010年Shay Banon 重寫了Compass,取名為Elasticsearch。
2、倒排索引
倒排索引的概念是基於MYSQL這樣的正向索引而言的
正向索引
如果是根據id查詢,那麼直接走索引,查詢速度非常快。
但如果是基於title做模糊查詢,只能是逐行掃描數據,流程如下:
1)用戶搜索數據,條件是title符合"%手機%"
2)逐行獲取數據,比如id為1的數據
3)判斷數據中的title是否符合用戶搜索條件
4)如果符合則放入結果集,不符合則丟棄。回到步驟1
逐行掃描,也就是全表掃描,隨著數據量增加,其查詢效率也會越來越低。當數據量達到數百萬時,就是一場災難。
倒排索引
倒排索引中有兩個非常重要的概念:
- 文檔(
Document
):用來搜索的數據,其中的每一條數據就是一個文檔。例如一個網頁、一個商品信息 - 詞條(
Term
):對文檔數據或用戶搜索數據,利用某種演算法分詞,得到的具備含義的詞語就是詞條。例如:我是中國人,就可以分為:我、是、中國人、中國、國人這樣的幾個詞條
創建倒排索引是對正向索引的一種特殊處理,流程如下:
- 將每一個文檔的數據利用演算法分詞,得到一個個詞條
- 創建表,每行數據包括詞條、詞條所在文檔id、位置等信息
- 因為詞條唯一性,可以給詞條創建索引,例如hash表結構索引
如圖:
倒排索引的搜索流程如下(以搜索"華為手機"為例):
1)用戶輸入條件"華為手機"
進行搜索。
2)對用戶輸入內容分詞,得到詞條:華為
、手機
。
3)拿著詞條在倒排索引中查找,可以得到包含詞條的文檔id:1、2、3。
4)拿著文檔id到正向索引中查找具體文檔。
如圖:
雖然要先查詢倒排索引,再查詢倒排索引,但是無論是詞條、還是文檔id都建立了索引,查詢速度非常快!無需全表掃描。
總結
那麼為什麼一個叫做正向索引,一個叫做倒排索引呢?
- 正向索引是最傳統的,根據id索引的方式。但根據詞條查詢時,必須先逐條獲取每個文檔,然後判斷文檔中是否包含所需要的詞條,是根據文檔找詞條的過程。
- 而倒排索引則相反,是先找到用戶要搜索的詞條,根據詞條得到保護詞條的文檔的id,然後根據id獲取文檔。是根據詞條找文檔的過程。
是不是恰好反過來了?那麼兩者方式的優缺點是什麼呢?
正向索引:
- 優點:
- 可以給多個欄位創建索引
- 根據索引欄位搜索、排序速度非常快
- 缺點:
- 根據非索引欄位,或者索引欄位中的部分詞條查找時,只能全表掃描。
倒排索引:
- 優點:
- 根據詞條搜索、模糊搜索時,速度非常快
- 缺點:
- 只能給詞條創建索引,而不是欄位
- 無法根據欄位做排序
3、ES核心概念
elasticsearch中有很多獨有的概念,與mysql中略有差別,但也有相似之處。
文檔和欄位
elasticsearch是面向文檔(Document)存儲的,可以是資料庫中的一條商品數據,一個訂單信息。文檔數據會被序列化為json格式後存儲在elasticsearch中:
而Json文檔中往往包含很多的欄位(Field),類似於資料庫中的列。
索引和映射
索引(Index),就是相同類型的文檔的集合。
例如:
- 所有用戶文檔,就可以組織在一起,稱為用戶的索引;
- 所有商品的文檔,可以組織在一起,稱為商品的索引;
- 所有訂單的文檔,可以組織在一起,稱為訂單的索引;
因此,我們可以把索引當做是資料庫中的表。
資料庫的表會有約束信息,用來定義表的結構、欄位的名稱、類型等信息。因此,索引庫中就有映射(mapping),是索引中文檔的欄位約束信息,類似表的結構約束。
mysql和ES概念對比
我們統一的把mysql與elasticsearch的概念做一下對比:
MySQL | Elasticsearch | 說明 |
---|---|---|
Table | Index | 索引(index),就是文檔的集合,類似資料庫的表(table) |
Row | Document | 文檔(Document),就是一條條的數據,類似資料庫中的行(Row),文檔都是JSON格式 |
Column | Field | 欄位(Field),就是JSON文檔中的欄位,類似資料庫中的列(Column) |
Schema | Mapping | Mapping(映射)是索引中文檔的約束,例如欄位類型約束。類似資料庫的表結構(Schema)。對索引欄位的描述(類型、分詞方式、是否要索引) |
SQL | DSL | DSL( Domain Specific Language)是elasticsearch提供的JSON風格的請求語句,用來操作elasticsearch,實現CRUD |
是不是說,我們學習了elasticsearch就不再需要mysql了呢?
並不是如此,兩者各自有自己的擅長支出:
- Mysql:擅長事務類型操作,可以確保數據的安全和一致性
- Elasticsearch:擅長海量數據的搜索、分析、計算
因此在企業中,往往是兩者結合使用:
- 對安全性要求較高的寫操作,使用mysql實現
- 對查詢性能要求較高的搜索需求,使用elasticsearch實現
- 兩者再基於某種方式,實現數據的同步,保證一致性
供個人複習使用,下期講解如何安裝和使用