1. 程式人生 > >《ElasticSearch權威指南》學習筆記

《ElasticSearch權威指南》學習筆記

、環境配置:

1.     安裝ElasticSearch與配置

2.     Head外掛安裝

3.     Kibanna安裝/Dev Tools安裝

4.     Elasticsearch 面向文件,它儲存和索引整個物件或者文件;對文件進行索引/檢索/過濾,而不是對列。

5.     儲存資料到Elasticsearch的行為叫做索引,一個Elasticsearch叢集可以包含多個索引,相應的索引也可以包含多個型別,這些不同的型別儲存著不同的文件,每個文件又有多個屬性。

6.     Elasticsearch和Lucene使用了一個叫做倒排索引的結構來提高資料檢索速度,預設每個文件中的每個屬性都會被索引,而且可搜尋。

7.     啟動:直接執行{ES_HOME}/bin/elasticsearch.bat  則直接執行在9002埠下。

8.     啟動Kibanna:直接執行{KIBANA_HOME}/bin/kibana.bat  訪問:

http://localhost:5601/app/kibana#/dev_tools/console?_g=()

9.     啟動head:直接在C:\軟體安裝\head\elasticsearch-head-master\elasticsearch-head-master下執行 grunt server  訪問:

http://localhost:9100/

10.curl使用:在CMD中執行:

curl -i -XGET http://localhost:9200/website/blog/124?pretty

二、簡單查詢

        1.     使用一條put命令就可以完成建立索引和型別以及新增資料。

PUT/megacorp/employee/1
{
    "first_name" : "John",
    "last_name" :  "Smith",
    "age" :        25,
    "about" :      "I love to go rock climbing",
    "interests": ["sports", "music" ]
}

        2.     使用get命令檢索文件:

GET /megacorp/employee/1

        3.     輕量檢索

GET /megacorp/employee/_search

        4.     高亮檢索

GET /megacorp/employee/_search?q=last_name:Smith

        5.     查詢表示式

GET/megacorp/employee/_search
{
  "query": {
    "match": {
      "last_name": "Smith"
    }
  }
}

        6.     查詢範圍使用filter

GET/megacorp/employee/_search
{
  "query":
  {
    "bool":
    {
      "must":
      {
        "match":
        {
         "last_name":"smith"
        }
      },
      "filter":
      {
        "range": {
          "age": {
            "gt": 30
          }
        }
      }
    }
  }
}

        7.     elasticsearch根據相關性返回文件,這跟關係型資料庫有很大差別

GET/megacorp/employee/_search
{
  "query":
  {
    "match":
    {
      "about":"rockclimbing"
    }
  }
}

        8.     短語搜尋

GET/megacorp/employee/_search
{
  "query":
  {
    "match_phrase":
    {
      "about":"rockclimbing"
    }
  }
}

        9.     高亮顯示短語搜尋匹配的結果

GET/megacorp/employee/_search
{
  "query":
  {
    "match_phrase":
    {
      "about":"rockclimbing"
    }
  },
  "highlight":
  {
    "fields":
    {
      "about":{}
    }
  }
}

       10.  聚合分析 按照興趣進行分組統計

        直接執行查詢,則顯示如下異常:"Fielddata is disabled on text fieldsby default. Set fielddata=true on”,執行如下PUT命令後,就可以直接操作了。

PUTmegacorp/_mapping/employee/
{
  "properties":
  {
    "interests":
    {
      "type":"text",
      "fielddata":true
    }
  }
}
GET /megacorp/employee/_search
{
  "aggs":
  {
    "all_interests":
    {
      "terms":
      {
        "field":"interests"
      }
    }
  }
}

        11.  對滿足條件的就進行分組統計  查詢名稱為smith的員工的興趣分組統計

GET/megacorp/employee/_search
{
  "query":
  {
    "match": {
      "last_name": "smith"
    }
  },
  "aggs":
  {
    "all_interests":
    {
      "terms":
      {
        "field":"interests"
      }
    }
  }
}

        12.  對分組聚合查詢所得結果求平均值   各個興趣關注員工的平均年齡

GETmegacorp/employee/_search
{
  "aggs":
  {
    "all_interests":
    {
      "terms":
      {
        "field":"interests"
      }
      , "aggs": {
        "avg_age": {
          "avg": {
            "field": "age"
          }
        }
      }
    }
  }
}

        13.  分散式特性

Elasticsearch自動進行如下操作:

    a.     分配文件到不同的容器或者分片中,文件可以儲存在一個或者多個節點中

    b.     按照叢集節點均衡分配這些分片,從而對索引和搜尋進行負載均衡

    c.     複製每個分片以支援資料冗餘,從而方式硬體故障導致的資料丟失

    d.     將叢集中任一節點的請求路由到存有資料的節點

    e.     叢集擴容時無縫整合新節點,重新分配分片以便從離群節點恢復

三、叢集內的原理

    1.     叢集節點:一個執行中Elasticsearch例項就是一個節點;每個節點都能夠將接收到的請求傳送到擁有相關資料的節點併成功返回查詢結果。

    2.     主節點:當一個節點被選擇為主節點時,它將負責管理叢集範圍內的所有變更,例如增加、刪除索引或者增加刪除節點等,主節點並不涉及文件級別的變更和搜尋等操作;任何節點都可以成為主節點。

    3.     叢集健康:查詢:GET /_cluster/health  

        查詢結果中的status欄位:

            green:所有主分片和副分片都正常

            yellow:所有主分片都執行正常,部分副分片執行不正常

            red:部分主分片未正常執行

    4.     新增索引

        向Elasticsearch中新增資料時需要用到索引——儲存相關資料的地方。索引是指向一個或者多個物理分片的邏輯名稱空間。

        一個分片是一個底層的工作單元,它僅儲存了全部資料的一部分,一個分片是一個lucene例項,其本身就是一個完整的搜尋引擎,文件會被儲存和索引到分片內,但是應用程式是直接與索引而不是與分片互動。

        分片是容器,文件儲存在分片內,而分片又被分配在不同的節點內;當叢集伸縮時,Elasticsearch會自動在各個節點中進行節點遷移,使資料均勻分佈在叢集裡。

        一個分片可以時主分片或者副分片,索引內任意一個文件都屬於主分片,所以主分片的數量決定了索引能夠儲存的最大資料量。

        一個副分片是一個主分片的拷貝,副分片作為主分片的資料冗餘備份以防硬體故障引起的資料丟失,併為搜尋和返回文件等讀操作提供服務。

        主分片數在建立索引時已經確定,但是副分片數可以隨時修改。

建立索引:

PUT/blogs
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
}

5.     新增故障轉移

        新增節點,可在同一臺機器啟動多個Elasticsearch例項,這樣就會有多個節點;同一臺機器上啟動多個例項時,Elasticsearch會根據cluster.name自動發現同一叢集節點,自動加入;如果在不同機器上啟動節點,則需要配置單播主機列表,以便讓此節點加入叢集。

6.     水平擴容

        增加節點,Elasticsearch會自動將分片在各個節點直接重新分配,以充分利用新加入的硬體資源。

可以通過調整副分片數目實現擴容:

PUT/blogs/_settings
{
  "number_of_replicas": 2
}

7.     應對故障

          分片的提升和恢復。

四、資料的輸入和輸出

        一個物件是基於特定語言的記憶體資料結構,JSON是一種以人可讀的文字表示物件的方法。

1.     物件和文件

        物件:類似於hash、hashmap、字典或者關聯陣列的JSON物件,物件中也可以巢狀其他物件。

        文件:指最頂層或者根物件,這個根物件被序列化成JSON並存儲在Elasticsearch中,並制定了唯一ID。

2.     文件元資料

        一個文件不僅僅包含它的資料,也包含元資料——有關文件的資訊,三個必須的元資料如下:

_index  文件存在在哪裡

        一個索引應該是因為擁有共同特性而被分在一起的文件集合。索引名稱要求:必須小寫,不能以下劃線開頭,不能包含逗號。

_type   文件表示的物件類別

               索引中資料的邏輯分割槽,不同的type內的文件可能有不同的欄位,但最好是相似的。Type命名要求:可以是大寫或者小寫,不能以下劃線開頭,不能包含逗號,長度不能超過256個字元。

_id     文件唯一標識

               _id與_index,_type組合就可以確定唯一一個文件,可自行提供,也可自動生成。

_version 文件版本號

               每個文件都有一個版本號,文件的任何修改(包括刪除),文件的版本號都會遞增。

3.     索引文件   使用index API,儲存或者使文件可被搜尋

A.自定義ID

PUT/{index}/{type}/{id}
{
  "field": "value",
  ...
}

B.自動生成ID

POST/website/blog/
{
  "title":"My second blogentry",
  "text":"Still trying thisout",
  "date":"2014/01/01"
}

4.     取回文件

GET /website/blog/1?pretty

    獲取部分欄位:

GET /website/blog/1?_source=title,text

    只獲取source:

GET/website/blog/1/_source

    提問:如果需要顯示source中的一部分欄位呢?

5.     檢查文件是否存在

    如果不需要返回內容,僅僅是確認文件是否存在,則可以使用HEAD

curl-i -XHEAD http://localhost:9200/website/blog/124

6.     更新整個文件

        在Elasticsearch中文件是不可變的,不能修改它們。如果需要更新現有文件,就需要重新建立索引或者進行替換,可以使用index API實現。

PUT /website/blog/1
{
  "title":"My first blogentry",
  "text":"I am starting to getthe hang of this ...",
  "date":"2014/01/02"
}

       使用update API 可以完成文件部分更新,但是實質根上述操作完全一致,唯一的區別是不需要單獨傳送get和index請求:

        A. 從舊文件構建JSON

        B. 更改該JSON

        C. 刪除舊文件

        D.索引一個新文件

7.     建立新文件

        索引一個文件時,我們需要確認時在覆蓋一個文件還是在建立一個文件。

                a.     使用post讓es自動生成唯一ID

POST/website/blog/
{
  "title":"My third blogentry",
  "text":"I am starting to getthe hang of this ...",
  "date":"2014/01/02"
}

                b.     使用op_type查詢字串  當指定index/type/id的文件不存在時才接受請求,否則異常

POST/website/blog/1?op_type=create
{
  "title":"My third blogentry",
  "text":"I am starting to getthe hang of this ...",
  "date":"2014/01/02"
}

                c.     在URL末端使用/_create  當指定index/type/id的文件不存在時才接受請求,否則異常

POST/website/blog/1/_create
{
  "title":"My third blogentry",
  "text":"I am starting to getthe hang of this ...",
  "date":"2014/01/02"
}

8.     刪除文件    邏輯刪除,然後自動在後臺物理清除

DELETE /website/blog/1

9.     處理衝突

        悲觀併發控制:

        樂觀併發控制:

10.  樂觀併發控制

        Elasticsearch通過使用_version(版本號)來避免新的版本被覆蓋;在搜尋返回結果中,包含有文件當前版本號,在對文件內容做修改後,提交時會檢查庫中文件的當前版本號與提交內容中的版本號是否一致,如果不一致,則請求失敗,如果一致,則執行請求。

PUT/website/blog/1?version=1
{
  "title":"My first blogentry",
  "text":"Starting to get thehang of this"
}

11.  通過外部系統使用版本控制

        如果主資料庫中已經存在一個可以作為版本號的欄位值比如timestamp,就可以在Elasticsearch中通過增加version_type=external到查詢字串的方式重用這些版本號,版本號必須是大於零的整數,且小於9.2e+18.

        處理方式:檢查當前_version是否小於指定的版本號,如果請求成功,外部的版本號作為文件新的版本號進行儲存。版本號在文件建立/索引/刪除時都可以指定。

PUT/website/blog/2?version=10&version_type=external
{
  "title":"My first externalblog entry",
  "text":"Starting to get thehang of this"
}

12.  文件的部分更新

        使用update API部分更新文件。

        檢索-修改-重建索引發生在分片內部,減少了多次請求的網路開銷,降低了衝突的可能性。

POST/website/blog/1/_update
{
   "doc" : {
      "tags" : [ "testing"],
      "views": 0
   }
}

13.  使用指令碼更新文件

POST/website/blog/1/_update
{
 "script":"ctx._source.views+=1"
}

        Elasticsearch允許使用指令碼編寫自定義的邏輯。可以在叢集中的所有節點的config/elasticsearch.yml 中禁用動態Groovy指令碼:

        Script.groovy.sandbox.enabled:false

以下指令碼執行失敗:

POST/website/blog/1/_update
{
   "script" :"ctx._source.tags+=new_tag",
   "params" : {
      "new_tag" : "search"
   }
}

14.  更新的文件可能不存在

        Upsert引數,指定如果所要更新的文件不存在則建立。

POST/website/blog/1/_update
{
 "script":"ctx._source.viess+=1",
  "upsert":
  {
    "viess":1
  }
}

        第一次執行上述請求時,upsert值作為新文件被索引,初始化viess欄位值為1,在後續的執行中,由於文件已經存在,script更新操作將替代upsert進行應用,對viess計數器進行累加。

15.  更新和衝突

        如果版本衝突,更新失敗,可以通過retry_on_conflict來自動完成重試操作。

POST/website/blog/1/_update?retry_on_conflict=5
{
 "script":"ctx._source.viess+=1",
  "upsert":{
    "viess":0
  }
}

16.  取回多個文件

GET /_mget
{
 "docs":[
    {
     "_index":"website",
     "_type":"blog",
     "_id":"2"
   },{
     "_index":"website",
     "_type":"pageviews",
     "_id":"1",
     "_source":"viess"
    }
    ]
}

        如果檢索的資料在相同的_index或者_type中,則可以在URL中指定預設的/_index或者預設的/_index/_type

GET /website/blog/_mget
{
 "docs": [
    {
     "_id": 2
   },
    {
     "_type": "pageviews",
     "_id": 1
    }
  ]
}
GET/website/blog/_mget
{
  "ids" : [ "2", "1" ]
}

17.  代價較小的批量操作

        bulk API  允許在單個步驟中多次create、index、update或delete請求。

   {action:{metadata}}\n
   {request body}\n
   {action:{metadata}}\n
   {request body}\n
      …

注意點:a.每行以\n結束,包括最後一行  b.不能包含未轉義字元,避免對解析造成干擾

Action/metadata指定做什麼操作

        Action 必須是一下選項之一:

                Create

                Index

                Update

                Delete

Metadata應該指定被索引、建立、更新或者刪除的文件的_index,_type和_id.

Request body 行由文件的_source本身組成,它是index、update和create操作所必需的,delete不需要。

Bulk請求不是原子的,不能用它來實現事務控制。

        整個批量請求都需要由接收到請求的節點載入到記憶體中,所以存在最佳請求大小,可以通過嘗試獲得該值。

POST/website/log/_bulk
{"delete":{"_index":"website","_type":"blog","_id":"123"}}
{"create":{"_index":"website","_type":"blog","_id":"123"}}
{"title":"Myfirst blog post"}
{"update":{"_index":"website","_type":"blog","_id":"123","_retry_on_conflict":3}}
{"doc":{"reviss":"Myupdated blog post"}}
{"index":{"_index":"website","_type":"blog"}}
{"title":"Mysecond blog post"}

五、分散式文件儲存

1.     路由一個文件到一個分片中

shard =hash(routing) % number_of_primary_shards

        routing 是一個可變值,預設是文件的id,也可以設定自定義值;number_of_primary_shards主分片的數量。上述公式所得結果分佈在0到number_of_primary_shards之間。

        所有的API都接受routing的路由引數,通過此引數我們可以自定義文件到分片的對映。

2.     主分片和副分片如何互動

相同分片的副本不會放在同一節點上;協調節點(coordinating node)

3.     新建、索引、刪除文件

        新建、索引、刪除請求都是寫操作,必須在主分片上面完成之後才能被複制到相關的副分片。

        操作順序:

                a.    客戶端向node1傳送新建、索引、刪除請求

                b.     節點使用文件的_id確定文件輸入分片0.請求會被轉發到node3,因為分片0的主分片在node3上。

                c.     Node3在主分片上執行請求,若成功,則同時將請求轉發到node1和node2的扶分片上,一旦副分片上請求報告成功,node3將向node1(協調節點)報告成功,協調節點向客戶端報告成功。

        一些額外引數:

       Consistency  預設設定向,當主分片數大於1時,執行請求籤主分片會要求必須要有規定資料量的分片副本處於活躍可用狀態,可會執行請求。

       Int((primary+number_of_replicas)/2)+1

       值:one   all  quorum

       number_of_replicas指的時在索引設定中的設定副本分片數,而不是指當前處理活動狀態的副本分片數。

Timeout  如果沒有到達規定數量的分片副本處於活躍可用狀態,則會等待一定時間,超過等待時間仍未滿足條件,則超時。

4.     取回單個文件

        在處理讀取請求時,協調節點在每次請求時都會通過輪詢所有的副本分片來達到負載均衡。

5.     區域性更新文件

       從主分片檢索文件,修改_source欄位中的JSON,重新索引主分片文件;若版本衝突,則重試;如果索引成功,則將完成文件的新版本並行轉發到擁有副本分片的節點,重新建立索引;副本分片返回成功,則向協調節點返回成功,協調節點向客戶端返回成功。

6.     多文件模式

        Mget和bulk API的模式類似於單文件模式,區別在於協調節點知道每個文件存在於哪個分片中;它將整個多文件請求分解成每個分片的多文件請求,並且將這些請求並行轉發到每個參與節點。協調節點一旦受到來自每個節點的應答,就將每個節點的響應收集整理成單個響應,返回給客戶端。

7.     搜尋-最基本的工具

相關推薦

Hadoop權威指南學習筆記

支持 第三方 handle line src factory 模式 多個 重要 HDFS簡單介紹 聲明:本文是本人基於Hadoop權威指南學習的一些個人理解和筆記,僅供學習參考。有什麽不到之處還望指出,一起學習一起進步。 轉載請註明:http://blog.cs

Kubernetes權威指南學習筆記(一)

資源利用率 date ace epo yaml policy 下一代 標識 code https://blog.csdn.net/keysilence1/article/details/70239717 概念 Kubernetes是谷歌嚴格保密十幾年的秘密武器——Bo

netty權威指南學習筆記四——TCP粘包/拆包之粘包問題解決

方法 pan 對象 protect row 學習 ddl .get font   發生了粘包,我們需要將其清晰的進行拆包處理,這裏采用LineBasedFrameDecoder來解決 LineBasedFrameDecoder的工作原理是它依次遍歷ByteBuf中的可讀字節

netty權威指南學習筆記六——編解碼技術之MessagePack

ssi add java exception 字節數組 ted evel thrift 發送   編解碼技術主要應用在網絡傳輸中,將對象比如BOJO進行編解碼以利於網絡中進行傳輸。平常我們也會將編解碼說成是序列化/反序列化   定義:當進行遠程跨進程服務調用時,需要把被傳輸

IDA Pro 權威指南學習筆記(二) - IDA 數據庫文件

names 標記 image 一個 輸入 需要 二叉 pro 樹形 把要分析的文件用 IDA 打開後,會生成 3 個數據庫文件 擴展名分別為 .id0,id1,nam .id0 文件是一個二叉樹形式的數據庫 .id1 文件包含描述每個程序字節的標記 .nam 文

IDA Pro 權威指南學習筆記(四) - IDA 用戶界面的基本規則

上下 工具 庫文件 發生 執行 ida 基於 需要 位置 基本規則: IDA 不提供撤銷功能 如果由於不小心按下某個鍵,導致數據庫文件發生意外,這時需要將顯示窗口恢復到以前的狀態 幾乎所有的操作都有其對應的菜單項、熱鍵和工具欄按鈕 IDA 的工具欄高度可配置,就像熱

IDA Pro 權威指南學習筆記(六) - 次要的 IDA 顯示窗口

方便 dump 可能 沒有 匯編 關系 布局 提高 整數 十六進制窗口 IDA 十六進制窗口可以配置為顯示各種格式,並可作為十六進制編輯器使用 默認情況下,十六進制窗口顯示程序內容和列表的標準十六進制代碼,每行顯示 16 個字節,以及其對應的 ASCII 字符 和在反

IDA Pro 權威指南學習筆記(八) - 基本 IDA 導航

當前 跳轉 previous 窗口 移動 http pro open 引用 導航目標 在分析階段,IDA 會通過檢查二進制文件的符號表生成符號名稱,或根據二進制文件引用位置的方式自動生成一個名稱 反匯編窗口中顯示的任何名稱都是導航目標 雙擊任何一個符號,IDA 將跳轉

IDA Pro 權威指南學習筆記(十四) - 操縱函數

禁用 not 當前 函數 reg 代碼區 字節 strong 掃描 IDA 無法定位一個函數調用,由於沒有直接的方法到達函數,IDA 將無法識別它們 IDA 可能無法正確確定函數的結束部分,需要手動幹預,以更正反匯編代碼中的錯誤 如果編譯器已經將函數分割到幾個地址範圍,

js權威指南學習筆記(一)類型、值和變量

聲明 for black inf 筆記 提升 under election 對象類型 1、數據類型:原始類型(primitive type) 和對象類型(object type) 原始類型包括數字、字符串和布爾值; 除數字、字符串、布爾值、null(空)、undefined

javascript權威指南--學習筆記

-一、JavaScript基本資料型別 1、數字--Number類 2、字串--String類 3、布林--Boolean類 4、函式Function 5、物件Object 6、陣列Array 7、null 8、undefined 備註:    當一個未定義的值用於布林環

ElasticSearch權威指南學習(分散式叢集)

空叢集 只有一個空節點的叢集 一個節點(node)就是一個Elasticsearch例項,而一個叢集(cluster)由一個或多個節點組成,它們具有相同的cluster.name,它們協同工作,分享資料和負載。當加入新的節點或者刪除一個節點時,叢集就會感知到並平衡資料。 叢集

ElasticSearch權威指南學習(對映和分析)

概念 對映(mapping)機制用於進行欄位型別確認,將每個欄位匹配為一種確定的資料型別(string, number, booleans, date等)。+ 分析(analysis)機制用於進行全文文字(Full Text)的分詞,以建立供搜尋用的反向索引。 資料型別差異 在索引中

jQuery權威指南學習筆記

快速生成HTML模板: 首先輸入"!",然後點選"Tab" ready與onload區別 執行時間不同:$(document).ready在頁面DOM模型載入完畢後就執行;而wondow.onload必須在頁面全部元素載入完畢(包括圖片下載)後才能執行多個,但僅輸出一個執行結

逆向工程權威指南學習筆記

宣告:本文整理自《逆向工程權威指南(上冊)》 非常亂,不行整理了。 第三章 RET 將控制權交給呼叫程式(將控制權交給作業系統) 編譯器在字串常量的尾部添加了00H,原因是為這個字串常量新增結束標誌(即數值為0的單個位元組) push offset $SG3803 通過p

Easticsearch官網《Elasticsearch權威指南筆記4——聚合

Elasticsearch 有一個功能叫聚合(aggregations),允許我們基於資料生成一些精細的分析結果。聚合與 SQL 中的 GROUP BY 類似但更強大。 例如:聚合員工興趣 GET /megacorp/employee/_search {

Easticsearch官網《Elasticsearch權威指南筆記2——文件基本操作

建立文件 PUT /megacorp/employee/1 { "first_name" : "John", "last_name" : "Smith", "age" : 25, "about" : "

Easticsearch官網《Elasticsearch權威指南筆記3——搜尋

使用DSL查詢 除了使用查詢字串查詢,ES還可以使用DSL領域特定語言構造查詢,使用JSON格式。 GET /megacorp/employee/_search { "query" : { "match" : {

Kubernetes權威指南學習筆記之 kubedns

參照書本2.5章https://blog.csdn.net/watermelonbig/article/details/79693962配套yamlhttps://github.com/kubeguide/samplecode/tree/master/Chapter2遇到的問

kubernetes 權威指南學習筆記(2) -- 基本概念和術語

基本概念和術語 Master&Node Kubernetes 叢集的兩種管理角色: Master 和 Node Maste