ElasticSearch核心概念
簡介
Elasticsearch 是一個(gè)分布式可擴(kuò)展的實(shí)時(shí)搜索和分析引擎,一個(gè)建立在全文搜索引擎 Apache Lucene™ 基礎(chǔ)上的搜索引擎.當(dāng)然 Elasticsearch 并不僅僅是 Lucene 那么簡單,它不僅包括了全文搜索功能,還可以進(jìn)行以下工作:
- 分布式實(shí)時(shí)文件存儲,并將每一個(gè)字段都編入索引,使其可以被搜索。
- 實(shí)時(shí)分析的分布式搜索引擎。
- 可以擴(kuò)展到上百臺服務(wù)器,處理PB級別的結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)。
核心概念
以下為ES和Mysql等的對照關(guān)系
Relational DB | Elasticsearch |
---|---|
數(shù)據(jù)庫(database) | 索引(indices) |
表(tables) | types |
行(rows) | documents |
字段(columns) | fields |
文檔
就是類似關(guān)系型數(shù)據(jù)庫的一行行的記錄
elasticsearch是面向文檔的,那么就意味著索弓和搜索數(shù)據(jù)的最小單位是文檔。
elasticsearch中,文檔有幾個(gè)重要屬性:
- 自我包含, 一篇文檔同時(shí)包含字段和對應(yīng)的值,也就是同時(shí)包含key:value !
- 可以是層次型的
- 靈活的結(jié)構(gòu),文檔不依賴預(yù)先定義的模式,我們知道關(guān)系型數(shù)據(jù)庫中,要提前定義字段才能使用,在elasticsearch中,對于字段是非常靈活的,有時(shí)候,我們可以忽略該字段,或者動(dòng)態(tài)的添加一個(gè)新的字段。
盡管我們可以隨意的新增或者忽略某個(gè)字段,但是,每個(gè)字段的類型非常重要,比如一一個(gè)年齡字段類型,可以是字符串也可以是整形。因?yàn)閑lasticsearch會(huì)保存字段和類型之間的映射及其他的設(shè)置。這種映射具體到每個(gè)映射的每種類型,這也是為什么在elasticsearch中,類型有時(shí)候也稱為映射類型。
類型
ES7之后Type被舍棄
類型是文檔的邏輯容器,就像關(guān)系型數(shù)據(jù)庫中的表一樣。
類型中對于字段的定義稱為映射,比如name映射為字符串類型。
我們說文檔是無模式的 ,它們不需要擁有映射中所定義的所有字段。
但是如果要新增一個(gè)字段,那么elasticsearch的流程是什么?
elasticsearch會(huì)自動(dòng)的將新字段加入映射,但是這個(gè)字段的不確定它是什么類型, elasticsearch就開始猜,如果這個(gè)值是18 ,那么elasticsearch會(huì)認(rèn)為它是整形。但是elasticsearch也可能猜不對 ,所以最安全的方式就是提前定義好所需要的映射,這點(diǎn)跟關(guān)系型數(shù)據(jù)庫殊途同歸了,先定義好字段,然后再使用。
索引
可以淺顯的理解為就是數(shù)據(jù)庫。
索引是映射類型的容器, elasticsearch中的索引是一個(gè)非常大的文檔集合。索引存儲了映射類型的字段和其他設(shè)置。然后它們被存儲到了各個(gè)分片上。
節(jié)點(diǎn)
Node為集群中的單臺節(jié)點(diǎn),其可以為master節(jié)點(diǎn)亦可為slave節(jié)點(diǎn)(節(jié)點(diǎn)屬性由集群內(nèi)部選舉得出)并提供存儲相關(guān)數(shù)據(jù)的功能
分片
在es中,默認(rèn)一個(gè)Es就是一個(gè)集群,一個(gè)集群又至少有一個(gè)節(jié)點(diǎn)。而一個(gè)節(jié)點(diǎn)就是一個(gè)es進(jìn)程,節(jié)點(diǎn)可以有多個(gè)默認(rèn)索引,如果你創(chuàng)建新索引,那么索引將會(huì)由5個(gè)分片( primary shard ,又稱主分片)構(gòu)成,每一個(gè)主分片會(huì)有一個(gè)副本( replica shard ,又稱復(fù)制分片)
分片有兩種類型:primary主片和replica副本,primary用于文檔存儲,Replica shard是Primary Shard的副本,用于冗余數(shù)據(jù)及提高搜索性能。
上圖是一個(gè)有3個(gè)節(jié)點(diǎn)的集群,可以看到主分片和對應(yīng)的復(fù)制分片都不會(huì)在同一個(gè)節(jié)點(diǎn)內(nèi),這樣有利于某個(gè)節(jié)點(diǎn)掛掉了,數(shù)據(jù)也不至于丟失。
實(shí)際上, 一個(gè)分片是一個(gè)Lucene索引, 一個(gè)包含倒排索引的文件目錄,倒排索引的結(jié)構(gòu)使得elasticsearch在不掃描全部文檔的情況下,就能告訴你哪些文檔包含特定的關(guān)鍵字
倒排索引
elasticsearch使用的是一種稱為倒排索引的結(jié)構(gòu),采用Lucene倒排索作為底層。這種結(jié)構(gòu)適用于快速的全文搜索,一個(gè)索引由文檔中所有不重復(fù)的列表構(gòu)成,對于每一個(gè)詞,都有一個(gè)包含它的文檔列表。 例如,現(xiàn)在有兩個(gè)文檔,每個(gè)文檔包含如下內(nèi)容:
Study every day, good good up to forever # 文檔1包含的內(nèi)容 To forever, study every day,good good up # 文檔2包含的內(nèi)容
為為創(chuàng)建倒排索引,我們首先要將每個(gè)文檔拆分成獨(dú)立的詞(或稱為詞條或者tokens) ,然后創(chuàng)建一個(gè)包含所有不重復(fù)的詞條的排序列表,然后列出每個(gè)詞條出現(xiàn)在哪個(gè)文檔:
現(xiàn)在,我們試圖搜索 to forever,只需要查看包含每個(gè)詞條的文檔
兩個(gè)文檔都匹配,但是第一個(gè)文檔比第二個(gè)匹配程度更高。如果沒有別的條件,現(xiàn)在,這兩個(gè)包含關(guān)鍵字的文檔都將返回。
再來看一個(gè)示例,比如我們通過博客標(biāo)簽來搜索博客文章。那么倒排索引列表就是這樣的一個(gè)結(jié)構(gòu):
博客文章(原始數(shù)據(jù)) | 博客文章(原始數(shù)據(jù)) | 索引列表(倒排索引) | 索引列表(倒排索引) |
---|---|---|---|
博客文章ID | 標(biāo)簽 | 標(biāo)簽 | 博客文章ID |
1 | python | python | 1,2,3 |
2 | python | linux | 3,4 |
3 | linux,python | ||
4 | linux |
如果要搜索含有python標(biāo)簽的文章,那相對于查找所有原始數(shù)據(jù)而言,查找倒排索引后的數(shù)據(jù)將會(huì)快的多。只需要查看標(biāo)簽這一欄,然后獲取相關(guān)的文章ID即可。完全過濾掉無關(guān)的所有數(shù)據(jù),提高效率!
elasticsearch的索引和Lucene的索引對比
在elasticsearch中,索引(庫)這個(gè)詞被頻繁使用,這就是術(shù)語的使用。在elasticsearch中 ,索引被分為多個(gè)分片,每份分片是一個(gè)Lucene的索引。所以一個(gè)elasticsearch索引是由多 個(gè)Lucene索引組成的。
到此這篇關(guān)于ElasticSearch簡介的文章就介紹到這了,更多相關(guān)ElasticSearch簡介內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Base64 編碼介紹、Base64編碼轉(zhuǎn)換原理與算法
Base64編碼,是我們程序開發(fā)中經(jīng)常使用到的編碼方法。它是一種基于用64個(gè)可打印字符來表示二進(jìn)制數(shù)據(jù)的表示方法,需要的朋友可以參考下2016-06-06使用selenium自動(dòng)控制瀏覽器找不到Chromedriver問題
這篇文章主要介紹了ChromeDriver安裝與配置問題的解決方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02