概述Elasticsearch (ES)是一個基于 Lucene 的開源搜索引擎,它不但穩(wěn)定、可靠、快速,而且也具有良好的水平擴展能力,是專門為分布式環(huán)境設計的。 特性
集群其中一個節(jié)點就是一個 ES 進程,多個節(jié)點組成一個集群。一般每個節(jié)點都運行在不同的操作系統(tǒng)上,配置好集群相關參數(shù)后 ES 會自動組成集群(節(jié)點發(fā)現(xiàn)方式也可以配置)。集群內(nèi)部通過 ES 的選主算法選出主節(jié)點(目前版本 1.2 存在腦裂問題),而集群外部則是可以通過任何節(jié)點進行操作,無主從節(jié)點之分(對外表現(xiàn)對等/去中心化,有利于客戶端編程,例如故障重連)。 索引“索引”有兩個意思:
為了方便理解,我們可以將 ES 中的一些概念對應到我們熟悉的關系型數(shù)據(jù)庫上:
分片ES 是一個分布式系統(tǒng),我們一開始就應該以集群的方式來使用它。它保存索引時會選擇適合的“主分片”(Primary Shard),把索引保存到其中(我們可以把分片理解為一塊物理存儲區(qū)域)。分片的分法是固定的,而且是安裝時候就必須要決定好的(默認是 5),后面就不能改變了。 既然有主分片,那肯定是有“從”分片的,在 ES 里稱之為“副本分片”(Replica Shard)。副本分片主要有兩個作用:
一個示例來個示例總結(jié)一下上面的內(nèi)容(結(jié)合下面的圖一起看):
(該圖是使用 ES 的 RESTful 接口獲取的,后面會介紹常用接口) 多租戶ES 的多租戶簡單的說就是通過多索引機制同時提供給多種業(yè)務使用,每種業(yè)務使用一個索引(關于多租戶的詳細定義與用途,可以參考這里)。前面我們提到過可以把索引理解為關系型數(shù)據(jù)庫里的庫,那多索引可以理解為一個數(shù)據(jù)庫系統(tǒng)建立多個庫給不同的業(yè)務使用。 在實際使用時,我們可以通過每個租戶一個索引的方式將他們的數(shù)據(jù)進行隔離,并且每個索引是可以單獨配置參數(shù)的(可對特定租戶進行調(diào)優(yōu)),這在典型的多租戶場景下非常有用:例如我們的一個多租戶應用需要提供搜索支持,這時可以通過 ES 根據(jù)租戶建立索引,這樣每個租戶就可以在自己的索引下搜索相關內(nèi)容了。 RESTful這個特性非常方便,最關鍵的是 ES 的 HTTP 接口不只是可以進行業(yè)務操作(索引/搜索),還可以進行配置,甚至是關閉 ES 集群。下面我們介紹幾個很常用的接口:
v 是 verbose 的意思,這樣可以更可讀(有表頭,有對齊),_cat 是監(jiān)測相關的 APIs,/_cat?help 來獲取所有接口。${index} 和 ${type} 分別是具體的某一索引某一類型,是分層次的。我們也可以直接在所有索引所有類型上進行搜索:/_search。 官方術語表最后,來份官方的術語表翻譯,鞏固一下理解: analysis 分析分析是將文本(text)轉(zhuǎn)化為查詢詞(term)的過程。使用不同的分析器,這三種短語:FOO BAR,F(xiàn)oo-Bar,foo,bar 都有可能被分解成查詢詞 foo 與 bar。這些查詢詞實際上將被存儲在索引中。一次對 FoO:bAR 的全文查詢(不是查詢詞查詢)可能會被分析為為查詢詞 foo,bar,可以匹配上保存在索引中的查詢詞。這就是分析處理過程(包含了索引與搜索),它使得 es 可以進行全文查詢。 cluster 集群一個或多個擁有同一個集群名稱的節(jié)點組成了一個集群。每個集群都會自動選出一個主節(jié)點,如果該主節(jié)點故障,則集群會自動選出新的主節(jié)點來替換故障節(jié)點。 document 文檔一個文檔就是一個保存在 es 中的 JSON 文本,可以把它理解為關系型數(shù)據(jù)庫表中的一行。每個文檔都是保存在索引中的,擁有一種類型和 id。一個文檔是一個 JSON 對象(一些語言中的 hash / hashmap / associative array)包含了 0 或多個字段(鍵值對)。原始的 JSON 文本在索引后將被保存在 _source 字段里,搜索完成后返回值中默認是包含該字段的。 idId 是用于標識文檔的,一個文檔的索引/類型/id 必須是唯一的。文檔 id 是自動生成的(如果不指定)。 field 字段一個文檔包含了若干字段,或稱之為鍵值對。字段的值可以是簡單(標量)值(例如字符串、整型、日期),也可以是嵌套結(jié)構(gòu),例如數(shù)組或?qū)ο蟆R粋€字段類似于關系型數(shù)據(jù)庫表中的一列。每個字段的映射都有一個字段類型(不要和文檔類型搞混了),它描述了這個字段可以保存的值類型,例如整型、字符串、對象。映射還可以讓我們定義一個字段的值如何進行分析。 index 索引一個索引類似關系型數(shù)據(jù)庫中的一個數(shù)據(jù)庫,它可以映射為多種類型。一個索引就是邏輯上的一個命名空間,對應到 1 或多個主分片上,可以擁有 0 個或多個副本分片。 mapping 映射一個映射類似于關系型數(shù)據(jù)庫中的模式定義。每個索引都存在一個映射,它定義了該索引中的每一種類型,以及索引相關的配置。映射可以顯示定義,或者在文檔被索引時自動創(chuàng)建。 node 節(jié)點一個節(jié)點是集群中的一個 es 運行實例。測試時,多個節(jié)點可以同時啟在同一個服務器上,生產(chǎn)環(huán)境一般是一個服務器上一個節(jié)點。節(jié)點啟動時將使用單播(或者是組播)來發(fā)現(xiàn)和自己配置的集群名稱相同的集群,并嘗試加入到該集群中。 primary shard 主分片每個文檔都會被保存在一個主分片上。當我們索引一個文檔時,它將在一個主分片上進行索引,然后才放到該主分片的各副本分片上。默認情況下,一個索引有 5 個主分片。我們可以指定更少或更多的主分片來伸縮索引可處理的文檔數(shù)。需要注意的是,一旦索引創(chuàng)建,就不能修改主分片個數(shù)。 replica shard 副本分片每個主分片可以擁有 0 個或多個副本分片。一個副本分片是主分片的一份拷貝,這樣做有兩個主要原因:
routing 路由當我們索引一個文檔時,它將被保存在一個主分片上,分片的選擇是通過路由值哈希得到的。默認情況下,路由值來自于文檔 id,如果該文檔指定來了父文檔,則路由值來自于父文檔 id(這是為了確保子文檔和父文檔被保存在相同的分片上)。該值可以在索引時指定,也可以通過映射路由字段來指定。 shard 分片一個分片就是一個 Lucene 實例,它是 es 管理的底層“工作單元”。一個索引是邏輯上的一個命名空間,指向主分片和副本分片。索引的主分片和副本分片數(shù)量必須明確指定好,在應用代碼使用時只需要處理和索引的交互,不會涉及到和分片的交互。Elasticsearch 會在集群中的所有節(jié)點上設置好分片,但節(jié)點失效或加入新節(jié)點時會自動將移動節(jié)點分片。 source field 源字段默認情況下,在獲取和搜索請求返回值中的 _source 字段保存了源 JSON 文本,這使得我們可以直接在返回結(jié)果中訪問源數(shù)據(jù),而不需要根據(jù) id 再發(fā)一次檢索請求。注意:索引的 JSON 字符串將完整返回,無論是否是一個合法的 JSON。該字段的內(nèi)容也不會描述數(shù)據(jù)如何被索引。 term 查詢詞一個查詢詞是一個被 es 索引的確切值。查詢詞 foo,F(xiàn)oo,F(xiàn)OO 是不同的。查詢詞可以使用查詢詞查詢接口進行獲取。 text 文本文本(或稱之為全文)是普通的、非結(jié)構(gòu)化的文本,例如本段話。默認情況下,文本將被分析為查詢詞,查詢詞將被保存在索引中。為能夠進行全文搜索,文本字段在索引時將被分析為查詢詞,查詢關鍵字在搜索時也將被分析為查詢詞,通過對比查詢詞是否相同而完成全文搜索。 type 類型一種類型類似于關系型數(shù)據(jù)庫中的一張表。每種類型都有若干字段,可以用于指定給該類型文檔。映射定義了該文檔中的每個字段如何進行分析。 參考 |
|
來自: kevin1981fu > 《技術收藏》