一、前言
前一段時(shí)間在接觸一個(gè)新項(xiàng)目的時(shí)候,學(xué)習(xí)和運(yùn)用了elasticsearch(簡稱es),后期會不定期出一系列es的學(xué)習(xí)筆記內(nèi)容(從初識到安裝再到應(yīng)用部署)。
事實(shí)證明,本科做課設(shè)涉及查詢搜索的時(shí)候數(shù)據(jù)量不大,基本不需要考慮太多應(yīng)用性能的問題,但是當(dāng)運(yùn)用的數(shù)據(jù)量級別開始變成“大數(shù)據(jù)”的情況下,如果還是僅僅簡單的數(shù)據(jù)庫查找,用戶可能需要等待幾分鐘甚至更長時(shí)間去檢索到需要的數(shù)據(jù)。所以es的作用就體現(xiàn)出來了,es在微服務(wù)和分布式應(yīng)用當(dāng)中應(yīng)用很廣泛的。
二、了解ES
2.1 elasticsearch的作用
elasticsearch(es)是一款非常強(qiáng)大的開源搜索引擎,具備非常多強(qiáng)大功能,可以幫助我們從海量數(shù)據(jù)中快速找到需要的內(nèi)容。例如在以下的應(yīng)用場景中,都會使用到es
- 在Github上搜索代碼
- 在電商網(wǎng)站搜索商品
- 在百度搜索答案
- 在打車軟件搜索附近的車(具體這個(gè)為什么后續(xù)系列會詳細(xì)說明的)
2.2 ELK技術(shù)棧
elasticsearch結(jié)合kibana、Logstash、Beats,也就是elastic stack(ELK)。被廣泛應(yīng)用在日志數(shù)據(jù)分析、實(shí)時(shí)監(jiān)控等領(lǐng)域。
而elasticsearch是elastic stack的核心,負(fù)責(zé)存儲、搜索、分析數(shù)據(jù)。
2.3 elasticsearch和lucene
elasticsearch底層是基于lucene來實(shí)現(xiàn)的。
Lucene是一個(gè)Java語言的搜索引擎類庫,是Apache公司的頂級項(xiàng)目,由DougCutting于1999年研發(fā)。官網(wǎng)地址:https://lucene.apache.org/ 。
elasticsearch的發(fā)展歷史:
- 2004年Shay Banon基于Lucene開發(fā)了Compass
- 2010年Shay Banon 重寫了Compass,取名為Elasticsearch。
ES的官網(wǎng)地址https://www.elastic.co/cn/
相比于lucene,elasticsearch具備如下優(yōu)勢:
- 支持分布式,可水平擴(kuò)展
- 提供Restful接口,可被任何語言調(diào)用
2.4 為什么不是其他搜索技術(shù)
答案很簡單:因?yàn)殚_源搜索引擎排名第一,大廠主流搜索引擎。
雖然在早期,Apache Solr是最主要的搜索引擎技術(shù),但隨著發(fā)展elasticsearch已經(jīng)漸漸超越了Solr,獨(dú)占鰲頭。Solr和ES的技術(shù)比較如下:
關(guān)于兩者的比較更加詳細(xì)的信息可以參考這篇文章
2.5 總結(jié)
什么是elasticsearch?
- 一個(gè)開源的分布式搜索引擎,可以用來實(shí)現(xiàn)搜索、日志統(tǒng)計(jì)、分析、系統(tǒng)監(jiān)控等功能
什么是elastic stack(ELK)?
- 是以elasticsearch為核心的技術(shù)棧,包括beats、Logstash、kibana、elasticsearch
什么是Lucene?
- 是Apache的開源搜索引擎類庫,提供了搜索引擎的核心API
三、倒排索引
倒排索引的概念是基于MySQL這樣的正向索引而言的。
3.1 正向索引
什么是正向索引呢?例如給下表(tb_goods)中的id創(chuàng)建索引:
如果是根據(jù)id查詢,那么直接走索引,查詢速度非???。
但如果是基于title做模糊查詢,只能是逐行掃描數(shù)據(jù),流程如下:
1)用戶搜索數(shù)據(jù),條件是title符合"%手機(jī)%"
2)逐行獲取數(shù)據(jù),比如id為1的數(shù)據(jù)
3)判斷數(shù)據(jù)中的title是否符合用戶搜索條件
4)如果符合則放入結(jié)果集,不符合則丟棄?;氐讲襟E1
逐行掃描,也就是全表掃描,隨著數(shù)據(jù)量增加,其查詢效率也會越來越低。當(dāng)數(shù)據(jù)量達(dá)到數(shù)百萬時(shí),就是一場災(zāi)難。
3.2 倒排索引
倒排索引中有兩個(gè)非常重要的概念:
- 文檔(
Document
):用來搜索的數(shù)據(jù),其中的每一條數(shù)據(jù)就是一個(gè)文檔。例如一個(gè)網(wǎng)頁、一個(gè)商品信息 - 詞條(
Term
):對文檔數(shù)據(jù)或用戶搜索數(shù)據(jù),利用某種算法分詞,得到的具備含義的詞語就是詞條。例如:我是中國人,就可以分為:我、是、中國人、中國、國人這樣的幾個(gè)詞條
創(chuàng)建倒排索引是對正向索引的一種特殊處理,流程如下:
- 將每一個(gè)文檔的數(shù)據(jù)利用算法分詞,得到一個(gè)個(gè)詞條
- 創(chuàng)建表,每行數(shù)據(jù)包括詞條、詞條所在文檔id、位置等信息
- 因?yàn)樵~條唯一性,可以給詞條創(chuàng)建索引,例如hash表結(jié)構(gòu)索引
如圖:
倒排索引的搜索流程如下(以搜索"華為手機(jī)"為例):
1)用戶輸入條件"華為手機(jī)"
進(jìn)行搜索。
2)對用戶輸入內(nèi)容分詞,得到詞條:華為
、手機(jī)
。
3)拿著詞條在倒排索引中查找,可以得到包含詞條的文檔id:1、2、3。
4)拿著文檔id到正向索引中查找具體文檔。
如圖:
雖然要先查詢倒排索引,再查詢倒排索引,但是無論是詞條、還是文檔id都建立了索引,查詢速度非???!無需全表掃描。
3.3 正向和倒排
那么為什么一個(gè)叫做正向索引,一個(gè)叫做倒排索引呢?
-
正向索引是最傳統(tǒng)的,根據(jù)id索引的方式。但根據(jù)詞條查詢時(shí),必須先逐條獲取每個(gè)文檔,然后判斷文檔中是否包含所需要的詞條,是根據(jù)文檔找詞條的過程。
-
而倒排索引則相反,是先找到用戶要搜索的詞條,根據(jù)詞條得到保護(hù)詞條的文檔的id,然后根據(jù)id獲取文檔。是根據(jù)詞條找文檔的過程。
正向索引:
- 優(yōu)點(diǎn):
- 可以給多個(gè)字段創(chuàng)建索引
- 根據(jù)索引字段搜索、排序速度非???/li>
- 缺點(diǎn):
- 根據(jù)非索引字段,或者索引字段中的部分詞條查找時(shí),只能全表掃描。
倒排索引:
- 優(yōu)點(diǎn):
- 根據(jù)詞條搜索、模糊搜索時(shí),速度非常快
- 缺點(diǎn):
- 只能給詞條創(chuàng)建索引,而不是字段
- 無法根據(jù)字段做排序
四、es的一些概念
elasticsearch中有很多獨(dú)有的概念,與mysql中略有差別,但也有相似之處。
4.1 文檔和字段
elasticsearch是面向**文檔(Document)**存儲的,可以是數(shù)據(jù)庫中的一條商品數(shù)據(jù),一個(gè)訂單信息。文檔數(shù)據(jù)會被序列化為json格式后存儲在elasticsearch中:
而Json文檔中往往包含很多的字段(Field),類似于數(shù)據(jù)庫中的列。
4.2 索引和映射
索引(Index),就是相同類型的文檔的集合。
例如:
- 所有用戶文檔,就可以組織在一起,稱為用戶的索引;
- 所有商品的文檔,可以組織在一起,稱為商品的索引;
- 所有訂單的文檔,可以組織在一起,稱為訂單的索引;
因此,我們可以把索引當(dāng)做是數(shù)據(jù)庫中的表。
數(shù)據(jù)庫的表會有約束信息,用來定義表的結(jié)構(gòu)、字段的名稱、類型等信息。因此,索引庫中就有映射(mapping),是索引中文檔的字段約束信息,類似表的結(jié)構(gòu)約束。
4.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ù)庫的表結(jié)構(gòu)(Schema) |
SQL | DSL | DSL是elasticsearch提供的JSON風(fēng)格的請求語句,用來操作elasticsearch,實(shí)現(xiàn)CRUD |
是不是說,我們學(xué)習(xí)了elasticsearch就不再需要mysql了呢?
并不是如此,兩者各自有自己的擅長支出:
-
Mysql:擅長事務(wù)類型操作,可以確保數(shù)據(jù)的安全和一致性
-
Elasticsearch:擅長海量數(shù)據(jù)的搜索、分析、計(jì)算
因此在企業(yè)中,往往是兩者結(jié)合使用:文章來源:http://www.zghlxwxcb.cn/news/detail-779283.html
- 對安全性要求較高的寫操作,使用mysql實(shí)現(xiàn)
- 對查詢性能要求較高的搜索需求,使用elasticsearch實(shí)現(xiàn)
- 兩者再基于某種方式,實(shí)現(xiàn)數(shù)據(jù)的同步,保證一致性
文章來源地址http://www.zghlxwxcb.cn/news/detail-779283.html
到了這里,關(guān)于初識elasticsearch的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!