1.1.了解ES(ElasticSearch)
1.1.1.ElasticSearch的作用
ElasticSearch
是一款非常強大的開源搜索引擎,具備非常多強大功能,可以幫助我們從海量數(shù)據(jù)中快速找到需要的內(nèi)容
例如:
-
在
GitHub
搜索代碼 -
在百度搜索答案
1.1.2.ELK技術棧
ElasticSearch
結合kibana
、Logstash
、Beats
,也就是elastic stack
(ELK
)。被廣泛應用在日志數(shù)據(jù)分析、實時監(jiān)控等領域:
而ElasticSearch
是elastic stack
的核心,負責存儲、搜索、分析數(shù)據(jù)。
1.1.3.ElasticSearch和lucene
ElasticSearch
底層是基于lucene
來實現(xiàn)的。
Lucene
是一個Java
語言的搜索引擎類庫,是Apache
公司的頂級項目,由DougCutting
于1999
年研發(fā)。官網(wǎng)地址:https://lucene.apache.org/ 。
Lucene
的優(yōu)勢:
-
易擴展
-
高性能(基于排序索引)
Lucene
的缺點:
-
只限于
java
語言開發(fā) -
學習曲線陡峭
-
不支持水平擴展
ElasticSearch
的發(fā)展歷史:
-
2004
年Shay Banon
基于Lucene
開發(fā)了Compass
; -
2010
年Shay Banon
重寫了Compass
,取名為Elasticsearch
。
相對于Lucene
,ElasticSearch
具備下列優(yōu)勢:
-
支持分布式,可水平擴展
-
提供
Restful
接口,可被任何語言調(diào)用
1.1.4.為什么不是其他搜索技術?
目前比較知名的搜索引擎技術排名:
雖然在早期,Apache Solr
是最主要的搜索引擎技術,但隨著發(fā)展ElasticSearch
已經(jīng)漸漸超越了Solr
,獨占鰲頭:
1.1.5.總結
什么是ElasticSearch
?
- 一個開源的分布式搜索引擎,可以用來實現(xiàn)搜索、日志統(tǒng)計、分析、系統(tǒng)監(jiān)控等功能
什么是elastic stack
(ELK
)?
- 是以
ElasticSearch
為核心的技術棧,包括beats
、Logstash
、kibana
、ElasticSearch
。
什么是Lucene
?
- 是
Apache
的開源搜索引擎類庫,提供了搜索引擎的核心API
。
1.2.倒排索引
倒排索引的概念是基于MySQL
這樣的正向索引而言的。
1.2.1.正向索引
那么什么是正向索引呢?例如給下表(tb_goods
)中的id
創(chuàng)建索引:
如果是根據(jù)id
查詢,那么直接走索引,查詢速度非常快。
但如果是基于title
做模糊查詢,只能是逐行掃描數(shù)據(jù),流程如下:
1)用戶搜索數(shù)據(jù),條件是title
符合"%手機%"
2)逐行獲取數(shù)據(jù),比如id
為1
的數(shù)據(jù)
3)判斷數(shù)據(jù)中的title
是否符合用戶搜索條件
4)如果符合則放入結果集,不符合則丟棄。回到步驟1
逐行掃描,也就是全表掃描,隨著數(shù)據(jù)量增加,其查詢效率也會越來越低。當數(shù)據(jù)量達到數(shù)百萬時,就是一場災難。
1.2.2.倒排索引
倒排索引中有兩個非常重要的概念:
- 文檔(
Document
):用來搜索的數(shù)據(jù),其中的每一條數(shù)據(jù)就是一個文檔。例如一個網(wǎng)頁、一個商品信息 - 詞條(
Term
):對文檔數(shù)據(jù)或用戶搜索數(shù)據(jù),利用某種算法分詞,得到的具備含義的詞語就是詞條。例如:我是中國人,就可以分為:我、是、中國人、中國、國人這樣的幾個詞條
創(chuàng)建倒排索引是對正向索引的一種特殊處理,流程如下:
- 將每一個文檔的數(shù)據(jù)利用算法分詞,得到一個個詞條
- 創(chuàng)建表,每行數(shù)據(jù)包括詞條、詞條所在文檔
id
、位置等信息 - 因為詞條唯一性,可以給詞條創(chuàng)建索引,例如
hash
表結構索引
如圖:
倒排索引的搜索流程如下(以搜索“華為手機”為例):
1)用戶輸入條件"華為手機"
進行搜索。
2)對用戶輸入內(nèi)容分詞,得到詞條:華為
、手機
。
3)拿著詞條在倒排索引中查找,可以得到包含詞條的文檔id
:1
、2
、3
。
4)拿著文檔id
到正向索引中查找具體文檔。
如圖:
雖然要先查詢倒排索引,再查詢倒排索引,但是無論是詞條、還是文檔id
都建立了索引,查詢速度非???!無需全表掃描。
1.2.3.正向和倒排
那么為什么一個叫做正向索引,一個叫做倒排索引呢?
-
正向索引是最傳統(tǒng)的,根據(jù)
id
索引的方式。但根據(jù)詞條查詢時,必須先逐條獲取每個文檔,然后判斷文檔中是否包含所需要的詞條,是根據(jù)文檔找詞條的過程。 -
而倒排索引則相反,是先找到用戶要搜索的詞條,根據(jù)詞條得到保護詞條的文檔的
id
,然后根據(jù)id
獲取文檔。是根據(jù)詞條找文檔的過程。
是不是恰好反過來了?
那么兩者方式的優(yōu)缺點是什么呢?
正向索引:
- 優(yōu)點:
- 可以給多個字段創(chuàng)建索引
- 根據(jù)索引字段搜索、排序速度非???/li>
- 缺點:
- 根據(jù)非索引字段,或者索引字段中的部分詞條查找時,只能全表掃描。
倒排索引:
- 優(yōu)點:
- 根據(jù)詞條搜索、模糊搜索時,速度非常快
- 缺點:
- 只能給詞條創(chuàng)建索引,而不是字段
- 無法根據(jù)字段做排序
1.3.ES的一些概念
ElasticSearch
中有很多獨有的概念,與mysql
中略有差別,但也有相似之處。
1.3.1.文檔和字段
ElasticSearch
是面向 文檔(Document
) 存儲的,可以是數(shù)據(jù)庫中的一條商品數(shù)據(jù),一個訂單信息。文檔數(shù)據(jù)會被序列化為json
格式后存儲在ElasticSearch
中:
而Json
文檔中往往包含很多的字段(Field
),類似于數(shù)據(jù)庫中的列。
1.3.2.索引和映射
索引(Index
),就是相同類型的文檔的集合。
例如:
- 所有用戶文檔,就可以組織在一起,稱為用戶的索引;
- 所有商品的文檔,可以組織在一起,稱為商品的索引;
- 所有訂單的文檔,可以組織在一起,稱為訂單的索引;
因此,我們可以把索引當做是數(shù)據(jù)庫中的表。
數(shù)據(jù)庫的表會有約束信息,用來定義表的結構、字段的名稱、類型等信息。因此,索引庫中就有映射(mapping
),是索引中文檔的字段約束信息,類似表的結構約束。
1.3.3.MySQL與ElasticSearch
我們統(tǒng)一的把MySQL
與ElasticSearch
的概念做一下對比:
MySQL |
ElasticSearch |
說明 |
---|---|---|
Table |
Index |
索引(index ),就是文檔的集合,類似數(shù)據(jù)庫的表(table ) |
Row |
Document |
文檔(Document ),就是一條條的數(shù)據(jù),類似數(shù)據(jù)庫中的行(Row ),文檔都是JSON 格式 |
Column |
Field |
字段(Field ),就是JSON 文檔中的字段,類似數(shù)據(jù)庫中的列(Column ) |
Schema |
Mapping |
Mapping (映射)是索引中文檔的約束,例如字段類型約束。類似數(shù)據(jù)庫的表結構(Schema ) |
SQL |
DSL |
DSL 是ElasticSearch 提供的JSON 風格的請求語句,用來操作ElasticSearch ,實現(xiàn)CRUD
|
是不是說,我們用了ElasticSearch
就不再需要MySQL
了呢?
并不是如此,兩者各自有自己的擅長支出:
-
Mysql
:擅長事務類型操作,可以確保數(shù)據(jù)的安全和一致性 -
ElasticSearch
:擅長海量數(shù)據(jù)的搜索、分析、計算
因此在企業(yè)中,往往是兩者結合使用:文章來源:http://www.zghlxwxcb.cn/news/detail-414198.html
- 對安全性要求較高的寫操作,使用
MySQL
實現(xiàn) - 對查詢性能要求較高的搜索需求,使用
ElasticSearch
實現(xiàn) - 兩者再基于某種方式,實現(xiàn)數(shù)據(jù)的同步,保證一致性
文章來源地址http://www.zghlxwxcb.cn/news/detail-414198.html
到了這里,關于SpringCloud:初識ES(ElasticSearch)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!