elasticsearch的作用
elasticsearch是一款非常強(qiáng)大的開源搜索引擎,具備非常多強(qiáng)大功能,可以幫助我們從海量數(shù)據(jù)中快速找到需要的內(nèi)容 。
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ù)。
elasticsearch和lucene
elasticsearch底層是基于lucene來實(shí)現(xiàn)的。
Lucene是一個(gè)Java語言的搜索引擎類庫,是Apache公司的頂級項(xiàng)目,由DougCutting于1999年研發(fā)。官網(wǎng)地址:Apache Lucene - Welcome to Apache Lucene 。
elasticsearch的發(fā)展歷史:
-
2004年Shay Banon基于Lucene開發(fā)了Compass
-
2010年Shay Banon 重寫了Compass,取名為Elasticsearch。
倒排索引
倒排索引中有兩個(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都建立了索引,查詢速度非常快!無需全表掃描。
正向和倒排
那么為什么一個(gè)叫做正向索引,一個(gè)叫做倒排索引呢?
-
正向索引是最傳統(tǒng)的,根據(jù)id索引的方式。但根據(jù)詞條查詢時(shí),必須先逐條獲取每個(gè)文檔,然后判斷文檔中是否包含所需要的詞條,是根據(jù)文檔找詞條的過程。
-
而倒排索引則相反,是先找到用戶要搜索的詞條,根據(jù)詞條得到保護(hù)詞條的文檔的id,然后根據(jù)id獲取文檔。是根據(jù)詞條找文檔的過程。
優(yōu)缺點(diǎn):
正向索引:
-
優(yōu)點(diǎn):
-
可以給多個(gè)字段創(chuàng)建索引
-
根據(jù)索引字段搜索、排序速度非???/p>
-
-
缺點(diǎn):
-
根據(jù)非索引字段,或者索引字段中的部分詞條查找時(shí),只能全表掃描。
-
倒排索引:
-
優(yōu)點(diǎn):
-
根據(jù)詞條搜索、模糊搜索時(shí),速度非???/p>
-
-
缺點(diǎn):
-
只能給詞條創(chuàng)建索引,而不是字段
-
無法根據(jù)字段做排序
-
es的一些概念
elasticsearch是面向文檔(Document)存儲的,可以是數(shù)據(jù)庫中的一條商品數(shù)據(jù),一個(gè)訂單信息。文檔數(shù)據(jù)會被序列化為json格式后存儲在elasticsearch中:
而Json文檔中往往包含很多的字段(Field),類似于數(shù)據(jù)庫中的列。
索引(Index),就是相同類型的文檔的集合。相當(dāng)于數(shù)據(jù)庫中的表。
例如:
-
所有用戶文檔,就可以組織在一起,稱為用戶的索引;
-
所有商品的文檔,可以組織在一起,稱為商品的索引;
-
所有訂單的文檔,可以組織在一起,稱為訂單的索引;
數(shù)據(jù)庫的表會有約束信息,用來定義表的結(jié)構(gòu)、字段的名稱、類型等信息。因此,索引庫中就有映射(mapping),是索引中文檔的字段約束信息,類似表的結(jié)構(gòu)約束。
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é)合使用:
-
對安全性要求較高的寫操作,使用mysql實(shí)現(xiàn)
-
對查詢性能要求較高的搜索需求,使用elasticsearch實(shí)現(xiàn)
-
兩者再基于某種方式,實(shí)現(xiàn)數(shù)據(jù)的同步,保證一致性文章來源:http://www.zghlxwxcb.cn/news/detail-799584.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-799584.html
到了這里,關(guān)于分布式搜索引擎--認(rèn)識的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!