轉(zhuǎn)自:https://www.cnblogs.com/wetest/p/6709621.html
主要轉(zhuǎn)載了基礎概念作為ES的簡單介紹。
簡介
ES是基于Lucenne的開源搜索引擎,Lucene是java編寫的一套開源文檔檢索的基礎庫,包括詞、文檔、域、倒排索引、段、相關(guān)性得分等基本功能,而ES直接使用了這些庫。
ES采用JAVA編寫,提供簡單API。同時支持橫向擴充,用于處理PB級數(shù)據(jù)。
應用場景:
- 海量數(shù)據(jù)分析引擎
- 站內(nèi)搜素引擎
- 數(shù)據(jù)倉庫
重要概念
集群(Cluster):ES是一個分布式的搜索引擎,由多臺物理機共同構(gòu)成。這些物理機通過配置相同的cluster name互相發(fā)現(xiàn),從而將自己組織為一個集群。
節(jié)點(Node):同一集群中的一個ES主機。
主分片(Primary shard):索引的一個物理子集。同一個索引可以切為多個分片,分布到不同的結(jié)點上,其實現(xiàn)是Lucene中的索引。
副本分片(Replica shard):每個主分片可以有一個或多個副本,個數(shù)可配置。ES將同一索引的不同分片分布到不同的節(jié)點上,提高容錯。對于一個索引,只要不是所有的分片所在節(jié)點都宕機,就可以繼續(xù)使用。
每個索引默認5個分片一個副本。
副本、節(jié)點的概念如下圖:

索引(Index):邏輯概念,一個可檢索的文檔對象的集合。類似與DB中的database概念。同一個集群中可建立多個索引。比如,生產(chǎn)環(huán)境常見的一種方法,對每個月產(chǎn)生的數(shù)據(jù)建索引,以保證單個索引的量級可控。
索引->類型->文檔,ES中的文檔以這樣的邏輯關(guān)系組織了起來。類型(Type):索引的下一級概念,大概相當于數(shù)據(jù)庫中的table。同一個索引里可以包含多個 Type。
可以直接就在一個索引中建一個type,在這個type下去建立文檔集合和進行搜索了。文檔(Document):即搜索引擎中的文檔概念,也是ES中一個可以被檢索的基本單位,相當于數(shù)據(jù)庫中的row,一條記錄。
字段(Field):相當于數(shù)據(jù)庫中的column。ES中,每個文檔,其實是以json形式存儲的。而一個文檔可以被視為多個字段的集合。比如一篇文章,可能包括了主題、摘要、正文、作者、時間等信息,每個信息都是一個字段,最后被整合成一個json串,落地到磁盤。
映射(Mapping):相當于數(shù)據(jù)庫中的schema,用來約束字段的類型,不過 ES 的 mapping 可以不顯式地指定,自動根據(jù)文檔數(shù)據(jù)創(chuàng)建。
ES友好的提供了RESTful(Representational State Transfer:表征性狀態(tài)轉(zhuǎn)移,是一種架構(gòu)風格)的API,可以通過HTTP請求直接完成所有操作。
比如下面官方的例子
往索引twitter添加文檔,type是tweet,文檔的id是1

根據(jù)user字段檢索文檔:

重要配置項
索引的分片數(shù)
分片數(shù)最好和節(jié)點數(shù)相關(guān),單機上最好不超過兩個,這樣每個查詢盡可能并行。ES中分片數(shù)確定了就不能調(diào)整,所以可以適度多分配。
另一種分片思路是按照時間緯度去定義ES索引,并調(diào)整分片數(shù)。heap內(nèi)存
官方為可用內(nèi)存的一半,通過啟動ES的環(huán)境中,定義環(huán)境變量的方式完成。
eg:export ES_HEAP_SIZE = 10gcluster.name
集群的邏輯名,只有相同名的機器才能在邏輯上組成一個集群。discovery.zen.minimum_master_nodes:
這個是用于集群的分布式?jīng)Q策的最少master機器個數(shù)。和常見的分布式協(xié)調(diào)算法一樣,為了避免腦裂現(xiàn)象,建議超過一半的機器,n/2+1discovery.zen.ping.unicast.hosts:
ES集群的機器列表。注意ES單點不用配置集群中的所有機器列表,像一個連通圖一樣,只要每臺機器配置了其他機器,而這些配置又是互相可以連接的,那ES最終就會發(fā)現(xiàn)所有機器,構(gòu)成集群。如['111.111.111.0','111.111.111.1','111.111.111.2']
mapping
mapping類似于數(shù)據(jù)庫里的表結(jié)構(gòu),定義個mapping就意味著創(chuàng)建了一個索引。
與數(shù)據(jù)庫不同的是,一個索引并不需要顯示地建立mapping,比如,上面那個在twitter索引插入文檔數(shù)據(jù)的例子,如果執(zhí)行的時候還沒有定義索引,ES便會根據(jù)文檔的字段和內(nèi)容,自動創(chuàng)建索引和mapping。這樣創(chuàng)建的索引字段,往往可能不是我們所需要的。所以,還是自己預先通過手動定義mapping來創(chuàng)建索引比較好。
下面是創(chuàng)建mapping的例子,這個例子在my_index這個目錄下,為user、blogpost這些type創(chuàng)建了mapping。其中properties下面是各種字段的定義,包括了string、數(shù)值、日期等類型的定義。

聚合
ES不僅能搜索,還能在搜索的結(jié)果集合上直接進行統(tǒng)計,目前聚合主要分兩種:Metrics Aggregation(指標聚合)和Bucket Aggregation(桶聚合)。
如官方guide的這個例子:找到交易的所有顏色的車,然后求它們的平均價格:

結(jié)果:
