Elasticsearch學習(2)—— 常見術語

cluster (集羣):一個或多個擁有同一個集羣名稱的節點組成了一個集羣。每一個集羣都會自動選出一個主節點,若是該主節點故障,則集羣會自動選出新的主節點來替換故障節點。node

node (節點):一個節點是集羣中的一個 Elasticsearch 運行實例。測試環境,多個節點能夠同時啓動在同一個服務器上,生產環境通常是一個服務器上一個節點。節點啓動時將使用單播或者是組播來發現和本身配置的集羣名稱相同的集羣,並嘗試加入到該集羣中。算法

shard (分片):一個分片就是一個Lucene實例,它是 Elasticsearch 管理的底層 「工做單元」。一個索引是邏輯上的一個命名空間,指向主分片和副本分片。索引的主分片和副本分片數量必須明確指定好,在應用代碼使用時只須要處理和索引的交互,不會涉及到和分片的交互。Elasticsearch 會在集羣中的全部節點上設置好分片,但節點失效或加入新節點時會自動將移動節點分片。數據庫

primary shard (主分片):每一個文檔都會被保存在一個主分片上。當咱們索引一個文檔時,它將在一個主分片上進行索引,而後才放到該主分片的各副本分片上。默認狀況下,一個索引有 5 個主分片。咱們能夠指定更少或更多的主分片來伸縮索引可處理的文檔數。須要注意的是,一旦索引建立,就不能修改主分片個數json

replica shard (副本分片):每一個主分片能夠擁有0個或多個副本分片,一個副本分片是主分片的一份拷貝。這樣作有兩個主要緣由:數組

  • 故障轉移:當主分片失效時,一個副本分片會被提高爲主分片。
  • 提升性能:獲取與搜索請求能夠被主分片或副本分片處理。默認狀況下,每一個主分片都有一個副本分片,副本分片的數量能夠動態調整。在同一個節點上,副本分片和其主分片不會同時運行。

單節點,三個主分片的原理圖

兩個節點,三個主分片,一個副本分片的原理圖

三個節點,三個主分片,兩個副本分片

索引中的主分片的數量在索引建立後就固定下來了,可是從分片的數量能夠隨時改變。服務器

在ES集羣中能夠監控統計不少信息,其中最重要的就是:集羣健康(cluster health)。它的 status 有 green、yellow、red 三種;app

status 意義
green 全部主分片和從分片均可用
yellow 全部主分片可用,但存在不可用的從分片
red 存在不可用的主要分片

index (索引)一個索引相似關係型數據庫中的一個數據庫,它能夠映射爲多種type。一個索引就是邏輯上的一個命名空間,對應到1或多個主分片上,能夠擁有0個或多個副本分片。函數

type (類型):表示一類類似的document。Type由名稱(如orderinfo,refundinfo)和mapping組成。相似於數據庫中的schema,描述了文檔可能具備的字段或屬性 、每一個字段的數據類型—好比 string, integer 或 date — 以及Lucene是如何索引和存儲這些字段的。類型能夠很好的抽象劃分類似但不相同的數據。每一個document的類型名被存儲在一個叫 _type 的元數據字段上性能

id:id 是用於標識文檔的。文檔 id 是自動生成的,若是顯式不指定。測試

document (文檔):一個文檔就是一個保存在 Elasticsearch 中的 JSON 文本,能夠把它理解爲關係型數據庫表中的一行。每一個文檔都是保存在索引中的,擁有一種type和 id。一個文檔是一個 JSON Object (一些語言中的 hash / hashmap / associative array) 包含了 0 或多個field (鍵值對)。原始的 JSON 文本在索引後將被保存在 _source字段裏,搜索完成後返回值中默認是包含該字段的。

document舉例:
{
  "_index": "test_index",
  "_type": "test_type",
  "_id": "1",
  "_version": 1,
  "_source": {
    "test_field1": "test field1",
    "test_field2": "test field2"
  }
}

一個document不僅包含了數據。它還包含了元數據(metadata) —— 關於文檔的信息。有三個元數據元素是必須存在的,它們是:

名字 說明
_index 文檔存儲的地方
_type 文檔表明的對象種類
_id 文檔的惟一編號
文檔經過 _index, _type以及_id來肯定它的惟一性。
其他可選的元數據類型:
名字 說明
_uid 組合id,由_type和_id組成
_source 文檔的原始json數據,能夠從這裏獲取每一個字段的內容
_all 整合全部字段內容到該字段,默認禁用

source field ( 源字段):默認狀況下,在獲取和搜索請求返回值中的 _source字段保存了 JSON 文本。這使得咱們能夠直接在返回結果中訪問源數據,而不須要根據 id 再發一次檢索請求。索引的 JSON 字符串將完整返回,不管是不是一個合法的 JSON。該字段的內容也不會描述數據如何被索引。

field (字段):一個文檔包含了若干字段,或稱之爲鍵值對字段的值能夠是簡單標量值,例如字符串、整型、日期,也能夠是嵌套結構,例如數組或對象。一個字段相似於關係型數據庫表中的一列。每一個字段的映射都有一個字段類型 ( 不要和文檔類型搞混了 ),它描述了這個字段能夠保存的值類型,例如整型、字符串、對象。mapping還可讓咱們定義一個字段的值如何進行分析

字段類型:

一級分類 二級分類 具體類型
核心類型 字符串類型 string,text,keyword
整數類型 integer,long,short,byte
浮點類型 double,float,half_float,scaled_float
邏輯類型 boolean
日期類型 date
範圍類型 range
二進制類型 binary
複合類型 數組類型 array
對象類型 object
嵌套類型 nested
地理類型 地理座標類型 geo_point
地理地圖 geo_shape
特殊類型 IP類型 ip
範圍類型 completion
令牌計數類型 token_count
附件類型 attachment
抽取類型 percolator

mapping (映射):就像數據庫中的schema描述了文檔可能具備的字段或屬性,每一個字段的數據類型以及Lucene是如何索引和存儲這些字段的。Elasticsearch的mapping一旦建立,只能增長字段,而不能修改已經mapping的字段。修改mapping只能經過從新創建一個index,而後建立一個新的mapping。

設置mapping

POST /library                  #給索引爲library建立映射關係

{

     "settings":{//分片的設置

     "number_of_shards" : 5,

     "number_of_replicas" : 1

      },

      "mappings":{

            "books":{          #索引爲library的type類型爲books

                "properties":{        #這裏往下就是映射關係

                    "title":{"type":"string"},

                    "name":{"type":"string","index":"not_analyzed"},

                    "publish_date":{"type":"date","index":"not_analyzed"},

                    "price":{"type":"double"},

                    "number":{

                        "type":"object",

                        "dynamic":true

                     }

                  }

               }

         }

}

獲取mapping

GET library/_mapping

{
   "library": {
      "mappings": {
         "books": {
            "properties": {
               "name": {
                  "type": "string",
                  "index": "not_analyzed"
               },
               "number": {
                  "type": "object",
                  "dynamic": "true"
               },
               "price": {
                  "type": "double"
               },
               "publish_date": {
                  "type": "date",
                  "format": "dateOptionalTime"
               },
               "title": {
                  "type": "string"
               }
            }
         }
      }
   }
}

term (查詢詞):一個查詢詞是一個被 Elasticsearch 索引的確切值。查詢詞 foo,Foo,FOO 是不一樣的。查詢詞可使用查詢詞查詢接口進行獲取。

"query": {
    "term": {
      "age": "39"
    }
  }

相似的terms

 "query" : {
        "constant_score" : {
            "filter" : {
                "terms" : {
                    "price" : [20, 30]
                }
            }
        }
    }

analysis 分析:分析是將文本 ( text ) 轉化爲查詢詞 ( term ) 的過程。好比這三種短語:FOO BAR,Foo-Bar,foo,bar 都有可能被分解成查詢詞 foo 與 bar。可使用不一樣的分析器,這些查詢詞實際上將被存儲在索引中。一次對 FoO:bAR 的全文查詢 ( 不是查詢詞查詢 ) 可能會被分析爲爲查詢詞 foo,bar,能夠匹配上保存在索引中的查詢詞。這就是分析處理過程(包含了索引與搜索),它使得 es 能夠進行全文查詢。

routing (路由):當咱們索引一個document時,它將被保存在一個主分片上,分片的選擇是經過路由值哈希獲得的。默認狀況下,路由值使用文檔的 id,若是該文檔指定了父文檔,則路由值使用父文檔 id。這是爲了確保子文檔和父文檔被保存在相同的分片上。該值能夠在索引時指定,也能夠經過映射路由字段來指定。

當你索引一個文檔,它被存儲在單獨一個主分片上。Elasticsearch是如何知道文檔屬於哪一個分片的呢?當你建立一個新文檔,它是如何知道是應該存儲在分片1仍是分片2上的呢?

進程不能是隨機的,由於咱們未來要索引文檔。事實上,它根據一個簡單的算法決定:

shard = hash(_routing) % number_of_primary_shards

_routing值是一個任意字符串,它默認是_id但也能夠自定義。這個_routing字符串經過哈希函數生成一個數字,而後除以主分片的數量獲得一個餘數(remainder),餘數的範圍永遠是0number_of_primary_shards - 1這個數字就是特定文檔所在的分片

=============================================================================

與數據庫概念的映射關係:

Elasticsearch

RDBMS

Elasticsearch

Relational DB

Indices(索引)

Databases

Types(類型)

Tables

Documents(文檔)

Rows

Fields(字段)

Columns

相關文章
相關標籤/搜索