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. 索引新文檔
腳本更新文檔
也可以通過使用簡單的腳本來進行。這個例子使用一個腳本將age加5:
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
使用單一請求來實現多個文檔的create、index、update 或 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 參數:
方式1:GET _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個結果,頁碼從1到3,那請求如下:
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. 索引新文檔 腳本更新文檔 也可以通過使用簡單的腳本來進行。這個例子使用一個腳本將age加5: 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 使用單一請求來實現多個文檔的create、index、update 或 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后不需要請求體,最后一行要有回車 |