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實作
- 兩者再基于某種方式,實作資料的同步,保證一致性
供個人復習使用,下期講解如何安裝和使用
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/555548.html
標籤:其他
上一篇:Java 運算子的使用
下一篇:返回列表