Elasticsearch詳解(一)


Java API

Elasticsearch 為Java用戶提供兩種內置客戶端:

節點客戶端(node client):

節點客戶端已無數據節點(none data node)身份加入集群,換言之,它自己不存儲任何數據,但是它知道數據在集群中的具體位置,並且能夠直接轉發請求到對應的節點上。

傳輸客戶端(transport client):

這個更輕量的傳輸客戶端能夠發送請求到遠程集群。它自己不加入集群,只是簡單的轉發請求給集群中的節點。

 

兩個Java客戶端都通過9300端口與集群交互,使用Elasticsearch 傳輸協議(Elasticsearch Transport Protocol)。集群中的節點 之間通過9300端口進行通信。如果此端口為開發,你的節點 講不能組成集群。

tip:Java客戶端所在的Elasticsearch版本必須與集群中其他節點一致,否則,它們可能互相無法識別。

基於HTTP協議,一JSON為數據交互格式的RESTFUL API

其他所有程序語言都可以使用RESTFUL API,通過9200端口與Elasticsearch進行通信,你可以使用你喜歡的WEB客戶端,事實上,如你所見,你甚至可以通過curl命令與Elasticsearch通信

NOTE Elasticsearch官方提供了多種程序語言的客戶端 ---——Groovy,Javascript, .NET,PHP,Perl,Python,以及 Ruby——還有很多由社區提供的客戶端和插件,所有這些可以在文檔中找到。

向Elasticsearch 發出請求的組成部分與其他普通的HTTP請求是一樣的:

curl -X<verb> <PROTOCOL>://<HOST>/<PATH>?<QUERY_STRING> -d<BODY>

verb HTTP 方法:GET , POST, PUT, HEAD, DELETE

PROTOCOL HTTP或者HTTPS協議(只有在Elasticsearch 前面有https代理的時候可用)

HOST Elasticsearch集群中的任何一個節點主機名,如果在本地節點,那么就叫localhost

PORT Elasticsearch http服務所在的端口 默認為9200

QUERY_STRING 一些可選的查詢請求參數,例如?pretty參數講請求返回更加美觀易讀的JSON數據

BODY 一個JSON格式的請求主體(如果請求需要的話)

舉例說明,為了計算集群中的文檔數據量,我們可以這樣做:

curl -XGET http://localhost:9200/_count?pretty? -d

{

  "query":{

    "math_all":{}

  }

}

Elasticsearch返回一個類似 200 OK 的HTTP狀態碼和JSON格式的響應主體(除了 HEAD 請求)。上面的請求會得到如下的
JSON格式的響應主體:
{
"count" : 0,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
}
}

面向文檔

應用中的對象很少只是簡單的鍵值列表,更多時候,它擁有復雜的數據結構,比如包含日期、地理位置、另一個對象或者數組。

總有一天,你會想把這些對象存儲到數據庫中。將這些數據保存到由行和列組成的關系數據庫中,就好像是把一個豐富,信息表現力強的對象 拆散了放入一個非常大的表格中:你不得不拆散對象以適應表模式(通常一列表示一個字段),然后又不得不在查詢的時候重建它們。

Elasticsearch是面向文檔(document oriented)的,這意味着它可以存儲整個對象或文檔。然而它不僅僅是存儲,還會索引每個文檔的內容之所以被搜索。在Elasticsearch中,你可以對文檔(而非成行成列的數據)進行索引、搜索、排序、過濾。這種理解數據的方式與以往完全不同,這也是Elasticsearch能夠執行復雜的全文搜索的原因之一。

JSON

Elasticsearch 使用Javascript對象符號(JavaScript Object Notation),也就是JSON,作為文檔序列化格式。JSON現在已經被大多語言所支持,而且已經成為NOSQL領域的標准格式。它簡潔、簡單且容易閱讀。

{
  "email": "john@smith.com",
  "first_name": "John",
  "last_name": "Smith",
  "info": {
    "bio": "Eco-warrior and defender of the weak",
    "age": 25,
    "interests": [ "dolphins", "whales" ]
      },
  "join_date": "2014/05/01"
}
盡管原始的user對象很復雜,但它的結構和對象的含義已經被完整的體現在JSON中了在Elasticsearch中將對象轉化為JSON 並做索引要比在biao結構中做相同的事情簡單的多

NOTE

盡管幾乎所有的語言都有相應的模塊用於將任意數據結構轉換為JSON,但每種語言處理細節不同。具體請查看serialization or marshalling 兩個用於處理JSON的模塊。Elasticsearch官方客戶端會自動為你序列化和反序列化JSON

 

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

Elasticsearch致力於隱藏分布式系統的復雜性。以下這些操作都是在底層自動
完成的:

1、將你的文檔分區到不同的容器或者分片(shards)中,它們可以存在於一個或
多個節點中。

2、將分片均勻的分配到各個節點,對索引和搜索做負載均衡。

3、冗余每一個分片,防止硬件故障造成的數據丟失。

將集群中任意一個節點上的請求路由到相應數據所在的節點。

4、無論是增加節點,還是移除節點,分片都可以做到無縫的擴展和遷移。

Elasticsearch 是一種分布式數據存儲引擎,實時存儲並檢索復雜數據結構---
序列化的JSON文檔。分片在索引創建的時候被指定,此后主分片不可變,復制分
片可以改變,復制分片:應對故障,防止丟失數據。w

文檔

對象是一個JSON結構體。文檔特指最頂層結構或者跟對象序列化成的JSON
數據(以唯一ID標識並存儲於Elasticsearch中)

一個文檔不只有數據。它還包含了元數據,三個必須的元數據節點:

_index

我們的數據被存儲和索引在分片(shards)中,索引只是一個把一個或多個分片分組在一起的邏輯空間

命名規則:這個名字必須是全部小寫,不能以下划線開頭,不能包含逗

_type

_type 的名字可以是大寫或小寫,不能包含下划線或逗號。

_id

id僅僅是一個字符串,它與 _index 和 _type 組合時,就可以在ELasticsearch中唯一標識一個文檔。當創建一個文檔,你可以
自定義 _id ,也可以讓Elasticsearch幫你自動生成。

 自動生成的ID有22個字符長,URL-safe, Base64-encoded string universally unique identifiers, 或者叫 UUIDs


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM