ES(ElasticSearch)文檔的表現形式以及增刪改查


 1、 ES中的文檔 

  ES是面向文檔(document oriented)的,這意味着它可以存儲整個對象或文檔(document)。然而它不僅僅是存儲,還會索引(index)每個文檔的內容使之可以被搜索。在ES中,你可以對文檔(而非成行成列的數據)進行索引、搜索、排序、過濾。

  ES使用Javascript對象符號(JavaScript Object Notation),也就是JSON,作為文檔序列化格式。JSON現在已經被大多語言所支持,而且已經成為NoSQL領域的標准格式。

  

  _index:索引庫,類似於關系型數據庫里的“數據庫”—它是我們存儲和索引關聯數據的地方。

  _type:類型,類似於關系型數據庫中。可以是大寫或小寫,不能包含下划線或逗號。我們將使用 employee 做為類型名。

  _id:與 _index  和 _type  組合時,就可以在ELasticsearch中唯一標識(類似於主鍵)一個文檔。當創建一個文檔,你可以自定義 _id  ,也可以讓Elasticsearch幫你自動生成。

  另外還包括:

  _uid:文檔唯一標識(_type#_id)

  _source:文檔原始數據

  _all:所有字段的連接字符串

 

2、文檔的增刪改

  我們以員工對象為例,我們首先要做的是存儲員工數據,每個文檔代表一個員工。在ES中存儲數據的行為就叫做索引(indexing),文檔歸屬於一種類型(type),而這些類型存在於索引(index)中,我們可以簡單的對比傳統數據庫和ES的對應關系:

  關系數據庫(MYSQL) -> 數據庫DB-> 表TABLE-> 行ROW-> 列Column

  Elasticsearch -> 索引庫Indices (數據庫)-> 類型Types(表) -> 文檔Documents(行) -> 字段Fields(列)

  ES集群可以包含多個索引(indices)(數據庫),每一個索引庫中可以包含多個類型(types)(表),每一個類型包含多個文檔(documents)(行),然后每個文檔包含多個字段(Fields)(列)。

 創建索引文檔

    ①使用自己的ID創建:

    PUT{index}/{type}/{id}

    {

      "field": "value",

      ...

    }

    ②ES內置ID創建:

    POST{index}/{type}/

    {

      "field": "value",

      ...

    }

    ①②ES響應內容:

    {

      "_index": "wang",

      "_type": "employee",

      "_id": xxxxxx,

      "_version": 1, //文檔版本號

      "created": true //是否新增

    }

    ③ 獲取指定ID的文檔

      GET wang/employee/123?pretty

    ③返回的內容:

     {

      "_index" : "wang",

      "_type" : "employee",

      "_id" : "123",

      "_version" : 1,

      "found" : true,

      "_source" : {

          "email": "sss@qq.cn",

          "fullName": "張三",

          ...

          "joine_date": "2016-06-01"

      }

     } 

返回文檔的部分字段:

    GET默認返回整個文檔,通過GET /wang/employee/123?_source=fullName,email

只返回文檔內容,不要元數據:

    GET wang/employee/123/_source

  

修改文檔

  更新整個文檔

  同PUT {index}/{type}/{id}

  在響應中,我們可以看到Elasticsearch _version  增加了。

  {

     ...

    "_version" : 2,

    "created": false

  }

  created  標識為 false  因為同索引、同類型下已經存在同ID的文檔。

  在內部,Elasticsearch已經標記舊文檔為刪除並添加了一個完整的新文檔。舊版本文檔不會立即消失,但你也不能去訪問它。Elasticsearch會在你繼續索引更多數據時清理被刪除的文檔。

  局部更新文檔

  接受一個局部文檔參數 doc,它會合並到現有文檔中,對象合並在一起,存在的標量字段被覆蓋,新字段被添加。

  POST wang/employee/123/_update

  {

doc{

"email" : "sss@qq.cn",

"salary": 1000

}

  }

  email會被更新覆蓋,salary會新增。

  這個API 似乎 允許你修改文檔的局部,但事實上Elasticsearch

  遵循與之前所說完全相同的過程,這個過程如下:

    1. 從舊文檔中檢索JSON

    2. 修改它

    3. 刪除舊文檔

    4. 索引新文檔

腳本更新文檔

  也可以通過使用簡單的腳本來進行。這個例子使用一個腳本將age5

  POST wang/emploee/123/_update

  {

    "script" : "ctx._source.age += 5"

  }

  在上面的例子中, ctx._source指向當前被更新的文檔。

  注意,目前的更新操作只能一次應用在一個文檔上。

 

刪除文檔

  DELETE {index}/{type}/{id}

  存在文檔的返回:

  {

    "found" : true,

    "_index" : "wang",

    "_type" : "blog",

    "_id" : "123",

    "_version" : 3

  }

  不存在的返回:

  {

    "found" : false,

    "_index" : "wang",

    "_type" : "blog",

    "_id" : "123",

    "_version" : 4

  }

注意:盡管文檔不存在,但_version依舊增加了。這是內部記錄的一部分,它確保在多節點間不同操作可以有正確的順序。

 

批量操bulk  API

    使用單一請求來實現多個文檔的createindexupdate delete

    Bulk請求體格式:

    { action: { metadata }}\n

    { request body }\n

    { action: { metadata }}\n

    { request body }\n

    每行必須以 "\n"  符號結尾,包括最后一行。這些都是作為每行有效的分離而做的標記。

    create當文檔不存在時創建之。

    index創建新文檔或替換已有文檔。

    update局部更新文檔。

    delete刪除一個文檔。

    例如:

    POST _bulk

    { "delete": { "_index": "wang", "_type": "employee", "_id": "123" }}

    { "create": { "_index": "wang", "_type": "blog", "_id": "123" }}

    { "title": "我下班了" }

    { "index": { "_index": "wang", "_type": "blog" }}

    { "title": "我真的下班了" }

注意:delete后不需要請求體,最后一行要有回車。

 

3、文檔的簡單查詢

3.1   通過文檔ID獲取

    略

    GET /test/employee/1

3.2   批量獲取

    mget  API參數是一個 docs數組,數組的每個節點定義一個文檔的 _index  _type  _id  元數據。如果你只想檢索一個或幾個確定的字段,也可以定義一個 _source    參數:

    方式1GET _mget

    {

      "docs" : [

{

"_index" : "itsource",

"_type" : "blog",

"_id" : 2

},

{

"_index" : "itsource",

"_type" : "employee",

"_id" : 1,

"_source": "email,age"

}

      ]

    }

 

  方式2同一個索引庫的同一個類型下

  GET itsource/blog/_mget

  {

    "ids" : [ "2", "1" ]

  }

3.3  空搜索-查詢所有

  沒有指定任何的查詢條件,只返回集群索引中的所有文檔:

   GET test/employee/_search 查詢所有的employee

  GET _search

3.4   分頁搜索

  和SQL使用 LIMIT from,size關鍵字返回只有一頁的結果一樣,Elasticsearch接受 from  size  參數:

    size  : 每頁條數,默認 10

    from  : 跳過開始的結果數,默認 0

  如果你想每頁顯示5個結果,頁碼從13,那請求如下:

    GET crm/emp/_search?size=5 #查詢5

    GET crm/emp/_search?size=5&from=5 #查詢6-10

    GET crm/emp/_search?size=5&from=10 #查詢11-15

3.5   查詢字符串搜索

  一個搜索可以用純粹的uri來執行查詢。在這種模式下使用搜索,並不是所有的選項都是暴露的。它可以方便快速進行 curl 測試。

  Sql查詢:

  查詢年齡為25歲的員工

    GET itsource/employee/_search?q=age:25

  如果q后的參數不指定Fileds則默認查詢_all字段(隱含的文檔所有字段的連接內容)

  類似的查詢語法參考lucene,如:

  組合查詢:

   +表示並且,多個條件做且運算====>MUST

   空格表示或,多個條件做或運算====>SHOULD

   -表示非,多個條件做非運算====>MUST_NOT

 

  +name:john +tweet:mary

  +name:(mary john) +date:>2014-09-10 +(aggregations geo)

  age[20 TO 30] 

  Select name,age from t_emp where age between and 10 order by age desc;

創建索引文檔

使用自己的ID創建:

PUT{index}/{type}/{id}

{

  "field": "value",

  ...

}

ES內置ID創建:

POST{index}/{type}/

{

  "field": "value",

  ...

}

①②ES響應內容:

{

"_index": "itsource",

"_type": "employee",

"_id": xxxxxx,

"_version": 1, //文檔版本號

"created": true //是否新增

}

 

獲取指定ID的文檔

GET itsource/employee/123?pretty

③返回的內容:

{

"_index" : "itsource",

"_type" : "employee",

"_id" : "123",

"_version" : 1,

"found" : true,

"_source" : {

   "email": "wb@itsource.cn",

   "fullName": "文兵",

   ...

   "joine_date": "2016-06-01"

}

}

返回文檔的部分字段:

GET默認返回整個文檔,通過GET /itsource/employee/123?_source=fullName,email

只返回文檔內容,不要元數據:

GET itsource/employee/123/_source

    只檢查文檔是否存在(查詢頭信息)

curl -i -X HEAD http://localhost:9200/itsource/employee/123

修改文檔

更新整個文檔

PUT {index}/{type}/{id}

在響應中,我們可以看到Elasticsearch _version  增加了。

{

...

"_version" : 2,

"created": false

}

created  標識為 false  因為同索引、同類型下已經存在同ID的文檔。

在內部,Elasticsearch已經標記舊文檔為刪除並添加了一個完整的新文檔。舊版本文檔不會立即消失,但你也不能去訪問它。Elasticsearch會在你繼續索引更多數據時清理被刪除的文檔。

局部更新文檔

接受一個局部文檔參數 doc,它會合並到現有文檔中,對象合並在一起,存在的標量字段被覆蓋,新字段被添加。

POST itsource/employee/123/_update

{

doc{

"email" : "wb@itsource.cn",

"salary": 1000

}

}

email會被更新覆蓋,salary會新增。

這個API 似乎 允許你修改文檔的局部,但事實上Elasticsearch

遵循與之前所說完全相同的過程,這個過程如下:

1. 從舊文檔中檢索JSON

2. 修改它

3. 刪除舊文檔

4. 索引新文檔

腳本更新文檔

也可以通過使用簡單的腳本來進行。這個例子使用一個腳本將age5

POST itsource/emploee/123/_update

{

"script" : "ctx._source.age += 5"

}

在上面的例子中, ctx._source指向當前被更新的文檔。

注意,目前的更新操作只能一次應用在一個文檔上。

刪除文檔

DELETE {index}/{type}/{id}

存在文檔的返回:

{

"found" : true,

"_index" : "website",

"_type" : "blog",

"_id" : "123",

"_version" : 3

}

不存在的返回:

{

"found" : false,

"_index" : "website",

"_type" : "blog",

"_id" : "123",

"_version" : 4

}

注意:盡管文檔不存在,但_version依舊增加了。這是內部記錄的一部分,它確保在多節點間不同操作可以有正確的順序。

批量操bulk  API

使用單一請求來實現多個文檔的createindexupdate delete

Bulk請求體格式:

{ action: { metadata }}\n

{ request body }\n

{ action: { metadata }}\n

{ request body }\n

每行必須以 "\n"  符號結尾,包括最后一行。這些都是作為每行有效的分離而做的標記。

create當文檔不存在時創建之。

index創建新文檔或替換已有文檔。

update局部更新文檔。

delete刪除一個文檔。

例如:

POST _bulk

{ "delete": { "_index": "itsource", "_type": "employee", "_id": "123" }}

{ "create": { "_index": "itsource", "_type": "blog", "_id": "123" }}

{ "title": "我發布的博客" }

{ "index": { "_index": "itsource", "_type": "blog" }}

{ "title": "我的第二博客" }

 

注意:delete后不需要請求體,最后一行要有回車

 

 


免責聲明!

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



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