ElasticSearch探索之路(一)初识ElasticSearch:特点、应用场景、架构设计、基本概念
文章目錄
- 什么是ElasticSearch?
- Lucene
- ELK
- Elasticsearch的特點(diǎn)
- 應(yīng)用場(chǎng)景
- 架構(gòu)設(shè)計(jì)
 
- 基本概念
- 文檔
- 類型
- 索引
 
什么是ElasticSearch?
Elasticsearch是一個(gè)分布式的免費(fèi)開源搜索和分析引擎,適用于包括文本、數(shù)字、地理空間、結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)等在內(nèi)的所有類型的數(shù)據(jù)。
Elasticsearch在Apache Lucene的基礎(chǔ)上開發(fā)而成。然而,Elasticsearch不僅僅是Lucene,并且也不僅僅只是一個(gè)全文搜索引擎。 它可以被下面這樣準(zhǔn)確的形容:
- 一個(gè)分布式的實(shí)時(shí)文檔存儲(chǔ),每個(gè)字段都可以被索引與搜索
- 一個(gè)分布式實(shí)時(shí)分析搜索引擎
- 能勝任上百個(gè)服務(wù)節(jié)點(diǎn)的擴(kuò)展,并支持PB級(jí)別的結(jié)構(gòu)化或者非結(jié)構(gòu)化數(shù)據(jù)
 
Lucene
Lucene是一套用于全文索引和搜索的開源程式庫,由Apache軟件基金會(huì)支持和提供。Lucene提供了一個(gè)簡(jiǎn)單卻強(qiáng)大的應(yīng)用程式接口,能夠做全文索引和搜索。但它不是一個(gè)完整的全文檢索引擎,而是一個(gè)全文檢索引擎的架構(gòu),提供了完整的查詢引擎和索引引擎,部分文本分析引擎(英文與德文兩種西方語言)。
Lucene的目的是為軟件開發(fā)人員提供一個(gè)簡(jiǎn)單易用的工具包,以方便的在目標(biāo)系統(tǒng)中實(shí)現(xiàn)全文檢索的功能,或者是以此為基礎(chǔ)建立起完整的全文檢索引擎。
在Java開發(fā)環(huán)境里L(fēng)ucene是一個(gè)成熟的免費(fèi)開源工具。就其本身而言,Lucene是當(dāng)前以及最近幾年最受歡迎的免費(fèi)Java信息檢索程序庫。人們經(jīng)常提到信息檢索程序庫,雖然與搜索引擎有關(guān),但不應(yīng)該將信息檢索程序庫與搜索引擎相混淆。
ELK
Elastic Stack是一套適用于數(shù)據(jù)采集、擴(kuò)充、存儲(chǔ)、分析和可視化的免費(fèi)開源工具。人們通常將Elastic Stack稱為ELK Stack(代指 Elasticsearch、Logstash 和 Kibana)。
Elastic StackLogstash是什么?
Logstash 是 Elastic Stack 的核心產(chǎn)品之一,可用來對(duì)數(shù)據(jù)進(jìn)行聚合和處理,并將數(shù)據(jù)發(fā)送到 Elasticsearch。Logstash 是一個(gè)開源的服務(wù)器端數(shù)據(jù)處理管道,允許您在將數(shù)據(jù)索引到 Elasticsearch 之前同時(shí)從多個(gè)來源采集數(shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行充實(shí)和轉(zhuǎn)換。
Kibana是什么?
Kibana 是一款適用于Elasticsearch的數(shù)據(jù)可視化和管理工具,可以提供實(shí)時(shí)的直方圖、線形圖、餅狀圖和地圖。Kibana同時(shí)還包括諸如 Canvas和Elastic Maps等高級(jí)應(yīng)用程序
- Canvas允許用戶基于自身數(shù)據(jù)創(chuàng)建定制的動(dòng)態(tài)信息圖表,
- Elastic Maps用來對(duì)地理空間數(shù)據(jù)進(jìn)行可視化。
Elasticsearch的特點(diǎn)
- Elasticsearch 很快。 由于Elasticsearch是在Lucene基礎(chǔ)上構(gòu)建而成的,所以在全文本搜索方面表現(xiàn)十分出色。Elasticsearch同時(shí)還是一個(gè)近實(shí)時(shí)的搜索平臺(tái),這意味著從文檔索引操作到文檔變?yōu)榭伤阉鳡顟B(tài)之間的延時(shí)很短,一般只有一秒。因此,Elasticsearch 非常適用于對(duì)時(shí)間有嚴(yán)苛要求的用例,例如安全分析和基礎(chǔ)設(shè)施監(jiān)測(cè)。
- Elasticsearch 具有分布式的本質(zhì)特征。Elasticsearch中存儲(chǔ)的文檔分布在不同的容器中,這些容器稱為分片,可以進(jìn)行復(fù)制以提供數(shù)據(jù)冗余副本,以防發(fā)生硬件故障。Elasticsearch的分布式特性使得它可以擴(kuò)展至數(shù)百臺(tái)(甚至數(shù)千臺(tái))服務(wù)器,并處理 PB 量級(jí)的數(shù)據(jù)。
- Elasticsearch 包含一系列廣泛的功能。 除了速度、可擴(kuò)展性和彈性等優(yōu)勢(shì)以外,Elasticsearch 還有大量強(qiáng)大的內(nèi)置功能(例如數(shù)據(jù)匯總和索引生命周期管理),可以方便用戶更加高效地存儲(chǔ)和搜索數(shù)據(jù)。
- Elastic Stack 簡(jiǎn)化了數(shù)據(jù)采集、可視化和報(bào)告過程。 通過與 Beats 和 Logstash 進(jìn)行集成,用戶能夠在向 Elasticsearch 中索引數(shù)據(jù)之前輕松地處理數(shù)據(jù)。同時(shí),Kibana 不僅可針對(duì) Elasticsearch 數(shù)據(jù)提供實(shí)時(shí)可視化,同時(shí)還提供 UI 以便用戶快速訪問應(yīng)用程序性能監(jiān)測(cè) (APM)、日志和基礎(chǔ)設(shè)施指標(biāo)等數(shù)據(jù)。
應(yīng)用場(chǎng)景
Elasticsearch在速度和可擴(kuò)展性方面都表現(xiàn)出色,而且還能夠索引多種類型的內(nèi)容,這意味著其可用于多種用例:
- 應(yīng)用程序搜索
- 網(wǎng)站搜索
- 企業(yè)搜索
- 日志處理和分析
- 基礎(chǔ)設(shè)施指標(biāo)和容器監(jiān)測(cè)
- 應(yīng)用程序性能監(jiān)測(cè)
- 地理空間數(shù)據(jù)分析和可視化
- 安全分析
- 業(yè)務(wù)分析
架構(gòu)設(shè)計(jì)
Elasticsearch架構(gòu)圖- Gateway:Elasticsearch用來存儲(chǔ)索引的文件系統(tǒng),支持多種類型。ElasticSearch默認(rèn)先把索引存儲(chǔ)在內(nèi)存中,然后當(dāng)內(nèi)存滿的時(shí)候,再持久化到Gateway里。當(dāng)ES集群關(guān)閉或重啟的時(shí)候,它就會(huì)從Gateway里去讀取索引數(shù)據(jù)。比如LocalFileSystem和HDFS、AS3等。
- DistributedLucene Directory:Lucene里的一些列索引文件組成的目錄。它負(fù)責(zé)管理這些索引文件。包括數(shù)據(jù)的讀取、寫入,以及索引的添加和合并等。
- Mapping:映射解析模塊。
- Search Moudle:搜索模塊。
- Index Moudle:索引模塊。
- Disvcovery:節(jié)點(diǎn)發(fā)現(xiàn)模塊。不同機(jī)器上的節(jié)點(diǎn)要組成集群需要進(jìn)行消息通信,集群內(nèi)部需要選舉master節(jié)點(diǎn),這些工作都是由Discovery模塊完成。支持多種發(fā)現(xiàn)機(jī)制,如 Zen 、EC2、gce、Azure。
- Scripting:Scripting用來支持在查詢語句中插入javascript、python等腳本語言。
- 3rd plugins:第三方插件。
- Transport:傳輸模塊,支持多種傳輸協(xié)議,如 Thrift、memecached、http,默認(rèn)使用http。
- JMX:JMX是java的管理框架,用來管理ES應(yīng)用。
- Java(Netty):java的通信框架。
- RESTful Style API:提供給用戶的接口,通過RESTful方式來實(shí)現(xiàn)API編程。
基本概念
Elasticsearch是一個(gè)文檔型數(shù)據(jù)庫,為了方便理解,下面給出其與傳統(tǒng)的關(guān)系型數(shù)據(jù)庫的對(duì)比
| 數(shù)據(jù)庫 Database | 索引 Index | 
| 表 Table | 類型 Type | 
| 行 Rows | 文檔 Document | 
| 列 columns | 字段 fields | 
| 表結(jié)構(gòu) schema | 映射 mapping | 
文檔
Elasticsearch是面向文檔的,索引和搜索數(shù)據(jù)的最小單位是文檔,并且使用JSON來作為文檔的序列化格式。每個(gè)文檔可以由一個(gè)或多個(gè)字段組成,類似于關(guān)系型數(shù)據(jù)庫中的一行記錄,在Elasticsearch中,文檔有幾個(gè)重要屬性
- 自我包含:一篇文檔同時(shí)包含字段和對(duì)應(yīng)的值。
- 層次型:文檔中還可以包含新的文檔,一個(gè)字段的取值也可以包含其他字段和取值。
- 結(jié)構(gòu)靈活:文檔不依賴預(yù)先定義的模式。在關(guān)系型數(shù)據(jù)庫中,要提前定義字段才能使用,在Elasticsearch中,對(duì)于字段是非常靈活的,有時(shí)候,我們可以忽略該字段,或者動(dòng)態(tài)的添加一個(gè)新的字段。
盡管我們可以隨意的新增或者忽略某個(gè)字段,但是,每個(gè)字段的類型非常重要,比如一個(gè)年齡字段類型,可以是字 串也可以是整形。因?yàn)镋lasticsearch會(huì)保存字段和類型之間的映射及其他的設(shè)置。這種映射具體到每個(gè)映射的每種類型,這也是為什么在Elasticsearch中,類型有時(shí)候也稱為映射類型。
類型
類型是文檔的邏輯容器,類似于表格是行的容器。在不同的類型中,最好放入不同結(jié)構(gòu)的文檔。(有點(diǎn)類似于關(guān)系型數(shù)據(jù)庫中的表的概念)。
每個(gè)類型中對(duì)于字段的定義稱為映射。比如name字段映射為string類型。 我們說文檔是無模式的,它們不需要擁有映射中所定義的所有字段,例如我們可能會(huì)新增一個(gè)映射中不存在的字段,那么Elasticsearch是怎么做的呢?
Elasticsearch會(huì)自動(dòng)的將新字段加入映射,由于不確定這個(gè)字段是什么類型,Elasticsearch就會(huì)根據(jù)字段的值來推導(dǎo)它的類型,如果這個(gè)值是10,那么Elasticsearch會(huì)認(rèn)為它是整形。 但是這種推導(dǎo)也可能會(huì)存在問題,如果這里的10實(shí)際上是字符串“10”,如果后續(xù)在索引字符串“hello world”,就會(huì)因?yàn)轭愋筒灰恢露鴮?dǎo)致索引失敗。 所以最安全的方式就是在索引數(shù)據(jù)之前,就定義好所需要的映射,這點(diǎn)跟關(guān)系型數(shù)據(jù)庫殊途同歸了,先定義好字段,然后再使用。
映射類型只是將文檔進(jìn)行邏輯劃分。從物理角度來看,同一索引的文檔都是寫入磁盤,而不考慮它們所屬的映射類型。
 
注意??:為什么ElasticSearch要在7.X版本去掉type?
在Elasticsearch設(shè)計(jì)初期,是直接查考了關(guān)系型數(shù)據(jù)庫的設(shè)計(jì)模式,存在了類型(表)的概念。 但是,其搜索引擎是基于Lucene的,這種基因決定了類型是多余的。Lucene的全文檢索功能之所以快,是因?yàn)?strong>倒序索引的存在。 而這種倒序索引的生成是基于索引的,而并非 類型。多個(gè)類型反而會(huì)減慢搜索的速度——兩個(gè)不同type下的兩個(gè)user_name,在ES同一個(gè)索引下其實(shí)被認(rèn)為是同一個(gè)filed,你必須在兩個(gè)不同的type中定義相同的filed映射。否則,不同type中的相同字段名稱就會(huì)在處理中出現(xiàn)沖突的情況,導(dǎo)致Lucene處理效率下降。
索引
在Elasticsearch中,索引有兩個(gè)含義:
- 名詞 - 索引是映射類型的容器,Elasticsearch中的索引是一個(gè)非常大的文檔集合,非常類似關(guān)系型數(shù)據(jù)庫中庫的概念。索引存儲(chǔ)了所有映射類型的字段。
 
- 動(dòng)詞 - 索引一個(gè)文檔就是存儲(chǔ)一個(gè)文檔到一個(gè)索引 (名詞)中以便被檢索和查詢。這非常類似于SQL中的INSERT關(guān)鍵詞,不同的是文檔已存在時(shí),新文檔會(huì)替換舊文檔(UPSERT)。
 
在Elasticsearch中,索引使用了一種稱為倒排索引(即通過查詢?cè)~索引到文檔)的結(jié)構(gòu),它適用于快速的全文搜索。一個(gè)倒排索引由文檔中所有不重復(fù)詞的列表構(gòu)成,對(duì)于其中每個(gè)詞,有一個(gè)包含它的文檔列表。
總結(jié)
以上是生活随笔為你收集整理的ElasticSearch探索之路(一)初识ElasticSearch:特点、应用场景、架构设计、基本概念的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Linux常见的一些性能监控命令
- 下一篇: ElasticSearch探索之路(三)
