ElasticSearch基本概念介紹(一)

1、概述
Elasticsearch是面向文檔(document oriented)的,這意味着它可以存儲整個對象或文檔(document)。然而它不僅僅是存儲,還會索引(index)每個文檔的內容使之可以被搜索。在Elasticsearch中,你可以對文檔(而非成行成列的數據)進行索引、搜索、排序、過濾。ES比傳統關係型數據庫,就像如下:

Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices   -> Types  -> Documents -> Fields

2、Elasticsearch核心概念
(1)接近實時(NRT)
Elasticsearch是一個接近實時的搜索平臺。這意味着,從索引一個文檔直到這個文檔能夠被搜索到有一個輕微的延遲(通常是1秒)。
(2)集羣(cluster)
一個集羣就是由一個或多個節點組織在一起,它們共同持有你整個的數據,並一起提供索引和搜索功能。一個集羣由一個唯一的名字標識,這個名字默認就是“elasticsearch”。這個名字是重要的,因爲一個節點只能通過指定某個集羣的名字,來加入這個集羣。
(3)節點(node)
一個節點是你集羣中的一個服務器,作爲集羣的一部分,它存儲你的數據,參與集羣的索引和搜索功能。和集羣類似,一個節點也是由一個名字來標識的,默認情況下,這個名字是一個隨機的漫威漫畫角色的名字,這個名字會在啓動的時候賦予節點。這個名字對於管理工作來說挺重要的,因爲在這個管理過程中,你會去確定網絡中的哪些服務器對應於Elasticsearch集羣中的哪些節點。

一個節點可以通過配置集羣名稱的方式來加入一個指定的集羣。默認情況下,每個節點都會被安排加入到一個叫做“elasticsearch”的集羣中,這意味着,如果你在你的網絡中啓動了若干個節點,並假定它們能夠相互發現彼此,它們將會自動地形成並加入到一個叫做“elasticsearch”的集羣中。

在一個集羣裏,只要你想,可以擁有任意多個節點。而且,如果當前你的網絡中沒有運行任何Elasticsearch節點,這時啓動一個節點,會默認創建並加入一個叫做“elasticsearch”的集羣。

(4)索引(index)
一個索引就是一個擁有幾分相似特徵的文檔的集合。比如說,你可以有一個客戶數據的索引,另一個產品目錄的索引,還有一個訂單數據的索引。一個索引由一個名字來標識(必須全部是小寫字母的),並且當我們要對對應於這個索引中的文檔進行索引、搜索、更新和刪除的時候,都要使用到這個名字。在一個集羣中,可以定義任意多的索引。

(5)類型(type)
在一個索引中,你可以定義一種或多種類型。一個類型是你的索引的一個邏輯上的分類/分區,其語義完全由你來定。通常,會爲具有一組共同字段的文檔定義一個類型。比如說,我們假設你運營一個博客平臺並且將你所有的數據存儲到一個索引中。在這個索引中,你可以爲用戶數據定義一個類型,爲博客數據定義另一個類型,當然,也可以爲評論數據定義另一個類型。

(6)文檔(document)
一個文檔是一個可被索引的基礎信息單元。比如,你可以擁有某一個客戶的文檔,某一個產品的一個文檔,當然,也可以擁有某個訂單的一個文檔。文檔以JSON(Javascript Object Notation)格式來表示,而JSON是一個到處存在的互聯網數據交互格式。

在一個index/type裏面,你可以存儲任意多的文檔。注意,儘管一個文檔,物理上存在於一個索引之中,文檔必須被索引/賦予一個索引的type。

(7)分片和複製(shards & replicas)
一個索引可以存儲超出單個結點硬件限制的大量數據。比如,一個具有10億文檔的索引佔據1TB的磁盤空間,而任一節點都沒有這樣大的磁盤空間;或者單個節點處理搜索請求,響應太慢。爲了解決這個問題,Elasticsearch提供了將索引劃分成多份的能力,這些份就叫做分片。當你創建一個索引的時候,你可以指定你想要的分片的數量。每個分片本身也是一個功能完善並且獨立的“索引”,這個“索引”可以被放置到集羣中的任何節點上。分片很重要,主要有兩方面的原因:
1)允許你水平分割/擴展你的內容容量。
2)允許你在分片(潛在地,位於多個節點上)之上進行分佈式的、並行的操作,進而提高性能/吞吐量。

至於一個分片怎樣分佈,它的文檔怎樣聚合回搜索請求,是完全由Elasticsearch管理的,對於作爲用戶的你來說,這些都是透明的。

在一個網絡/雲的環境裏,失敗隨時都可能發生,在某個分片/節點不知怎麼的就處於離線狀態,或者由於任何原因消失了,這種情況下,有一個故障轉移機制是非常有用並且是強烈推薦的。爲此目的,Elasticsearch允許你創建分片的一份或多份拷貝,這些拷貝叫做複製分片,或者直接叫複製。

複製之所以重要,有兩個主要原因: 在分片/節點失敗的情況下,提供了高可用性。因爲這個原因,注意到複製分片從不與原/主要(original/primary)分片置於同一節點上是非常重要的。擴展你的搜索量/吞吐量,因爲搜索可以在所有的複製上並行運行。總之,每個索引可以被分成多個分片。一個索引也可以被複制0次(意思是沒有複製)或多次。一旦複製了,每個索引就有了主分片(作爲複製源的原來的分片)和複製分片(主分片的拷貝)之別。分片和複製的數量可以在索引創建的時候指定。在索引創建之後,你可以在任何時候動態地改變複製的數量,但是你事後不能改變分片的數量。

默認情況下,Elasticsearch中的每個索引被分片5個主分片和1個複製,這意味着,如果你的集羣中至少有兩個節點,你的索引將會有5個主分片和另外5個複製分片(1個完全拷貝),這樣的話每個索引總共就有10個分片。

3、mapping介紹
(1)概念
ES的mapping非常類似於靜態語言中的數據類型:聲明一個變量爲int類型的變量, 以後這個變量都只能存儲int類型的數據。同樣的, 一個number類型的mapping字段只能存儲number類型的數據。

同語言的數據類型相比,mapping還有一些其他的含義,mapping不僅告訴ES一個field中是什麼類型的值, 它還告訴ES如何索引數據以及數據是否能被搜索到。

當你的查詢沒有返回相應的數據, 你的mapping很有可能有問題。當你拿不準的時候, 直接檢查你的mapping。

(2)mapping組成
一個mapping由一個或多個analyzer組成, 一個analyzer又由一個或多個filter組成的。當ES索引文檔的時候,它把字段中的內容傳遞給相應的analyzer,analyzer再傳遞給各自的filters。

filter的功能很容易理解:一個filter就是一個轉換數據的方法, 輸入一個字符串,這個方法返回另一個字符串,比如一個將字符串轉爲小寫的方法就是一個filter很好的例子。

一個analyzer由一組順序排列的filter組成,執行分析的過程就是按順序一個filter一個filter依次調用, ES存儲和索引最後得到的結果。

總結來說, mapping的作用就是執行一系列的指令將輸入的數據轉成可搜索的索引項。

(3)實例

curl -XPUT http://xxxxxx:9400/test/item/1 -d '{"name":"jack", "description": "A Pretty cool boy."}'

//ES能非常聰明的識別出"name""description"字段的類型是string, ES默認會創建以下的mapping。

mappings: {  
    item: {  
        properties: {  
            description: {  
                type: string  
            }  
            name: {  
                type: string  
            }  
        }  
    }  
}  

但是,通常我們需要設置它的analyzer, 默認的analyzer是標準analyzer, 這個標準analyzer有三個filter:token filter, lowercase filter和stop token filter。如:

//創建index,並且設置副本和分片
curl -XPOST 'http://xxxxxx:9400/index_order_new/' -d '{"settings":{"index":{"number_of_replicas":1,"number_of_shards":12}}}'

//創建mapping
curl -XPOST 'http://xxxxxx:9400/index_order_new/_mapping/trade' -d '{"trade":{"dynamic":"strict","_all":{"enabled":false},"properties":{"buyer_obtain_point_fee":{"type":"double"},"step_trade_status":{"index":"not_analyzed","type":"string"},"xxxx":{"search_analyzer":"stop","analyzer":"stop","type":"string"},"consign_time":{"index":"not_analyzed","type":"string"},"xxxx":{"index":"not_analyzed","type":"string"},"tid":{"index":"not_analyzed","type":"string"},"xxxx":{"index":"not_analyzed","type":"string"},"xxxx":{"index":"not_analyzed","type":"string"},"xxxx":{"index":"not_analyzed","type":"string"},"xxxx":{"type":"double"},"xxxx":{"index":"not_analyzed","type":"string"},"xxxx":{"type":"double"},"xxxx":{"type":"double"},"status":{"index":"not_analyzed","type":"string"},"xxxx":{"index":"not_analyzed","type":"string"},"xxxx":{"index":"not_analyzed","type":"string"},"xxxx":{"type":"double"},"xxxx":{"index":"not_analyzed","type":"string"},"cod_status":{"index":"not_analyzed","type":"string"},"xxxx":{"index":"not_analyzed","type":"string"},"xxxx":{"type":"double"},"xxxx":{"index":"not_analyzed","type":"string"},"xxxx":{"index":"not_analyzed","type":"string"},"xxxx":{"type":"double"},"xxxx":{"index":"not_analyzed","type":"string"},"xxxx":{"index":"not_analyzed","type":"string"},"xxxx":{"index":"not_analyzed","type":"string"},"xxxx":{"index":"not_analyzed","type":"string"},"xxxx":{"type":"double"},"xxxx":{"type":"double"},"num":{"type":"long"},"xxxx":{"type":"double"},"end_time":{"index":"not_analyzed","type":"string"}}}}
發佈了182 篇原創文章 · 獲贊 106 · 訪問量 60萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章