基于 ElasticSearch-6.1.2
成都創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、成都網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的洪澤網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
參考官方權(quán)威指南 文檔元數(shù)據(jù)
一個文檔有三個必須的元數(shù)據(jù)元素:
_index:表示文檔存放在哪個 index 中;
_type:文檔表示的對象類型;
_id:文檔的唯一標識;
通過使用 index API,使得文檔可以被 索引 -- 即存儲文檔,以及使得文檔可以被搜索。
以下為索引一篇blog的例子,其中:index 為 website,類型為 blog,自定義的ID為 123,
PUT /website/blog/123 HTTP/1.1 { "date": "2014/01/01", "text": "Still trying this out...", "title": "My second blog entry"}
ES 的響應(yīng)體如下:
HTTP/1.1 201 Created Location: /website/blog/123 content-encoding: gzip content-length: 143 content-type: application/json; charset=UTF-8 { "_id": "123", "_index": "website", "_primary_term": 1, "_seq_no": 0, "_shards": { "failed": 0, "successful": 1, "total": 2 }, "_type": "blog", "_version": 1, "result": "created" }
在 ES 中,每個文檔都會有個版本號(響應(yīng)中的 _version 字段),每次修改和刪除,_version 都會自增。
采用 POST 提交索引請求:
POST /website/blog/ HTTP/1.1 { "date": "2014/01/01", "text": "Still trying this out...", "title": "My second blog entry" }
如下為 ES 的響應(yīng):
HTTP/1.1 201 Created Location: /website/blog/UALcG2EBr-dnzPFB0zH1 content-encoding: gzip content-length: 165 content-type: application/json; charset=UTF-8 { "_id": "UALcG2EBr-dnzPFB0zH1", "_index": "website", "_primary_term": 1, "_seq_no": 0, "_shards": { "failed": 0, "successful": 1, "total": 2 }, "_type": "blog", "_version": 1, "result": "created"}
除了 _id 是 ES 自動生成的之外,其他響應(yīng)字段都和上面的類似。
自動生成的 ID 是 URL-safe、 基于 Base64 編碼且長度為20個字符的 GUID 字符串。 這些 GUID 字符串由可修改的 FlakeID 模式生成,這種模式允許多個節(jié)點并行生成唯一 ID ,且互相之間的沖突概率幾乎為零。
查詢 ID 為 123 的 blog 的請求:
GET /website/blog/123?pretty HTTP/1.1
請求后面的 pretty 參數(shù)使得 ES 在輸出時調(diào)用 prety-print 功能,使得 JSON 響應(yīng)體更加可讀。
ES 響應(yīng)如下:
HTTP/1.1 200 OK content-encoding: gzip content-length: 173 content-type: application/json; charset=UTF-8 { "_id": "123", "_index": "website", "_source": { "date": "2014/01/01", "text": "Still trying this out...", "title": "My second blog entry" }, "_type": "blog", "_version": 1, "found": true}
響應(yīng)體中的 {"found": true} 表示文檔已經(jīng)檢索到,如果沒有指定的文檔,則會返回 found = false,如下:
GET /website/blog/124?pretty HTTP/1.1 HTTP/1.1 404 Not Found content-encoding: gzip content-length: 87 content-type: application/json; charset=UTF-8 { "_id": "124", "_index": "website", "_type": "blog", "found": false}
如下只返回 blog 的標題字段,而不是默認的返回所有字段:
GET /website/blog/123?pretty&_source=title HTTP/1.1 HTTP/1.1 200 OK content-encoding: gzip content-length: 136 content-type: application/json; charset=UTF-8 { "_id": "123", "_index": "website", "_source": { "title": "My second blog entry" }, "_type": "blog", "_version": 1, "found": true}
GET /website/blog/123/_source?pretty HTTP/1.1 HTTP/1.1 200 OK content-encoding: gzip content-length: 113 content-type: application/json; charset=UTF-8 { "date": "2014/01/01", "text": "Still trying this out...", "title": "My second blog entry"}
2.3 檢查文檔是否存在
使用 HEAD 請求,只返回一個 HTTP 請求報文頭:
HEAD /website/blog/123 HTTP/1.1 |
如果文檔存在,則返回一個 200 OK 的狀態(tài)碼:
HTTP/1.1 200 OK content-length: 186 content-type: application/json; charset=UTF-8 |
如果不存在,則返回一個 404 Not Found 的狀態(tài)碼:
HTTP/1.1 404 Not Found content-length: 61 content-type: application/json; charset=UTF-8 |
3,更新文檔
ES 中的文檔是 *不可改變* 的,不能修改的,如果需要更新現(xiàn)有的文檔,需要 重建索引 或者進行替換。
PUT /website/blog/123 HTTP/1.1 Accept: application/json, */* Accept-Encoding: gzip, deflate Connection: keep-alive Content-Length: 117 Content-Type: application/json Host: localhost:9200 { "date": "2014/01/02", "text": "I am starting to get the hang of this...", "title": "My first blog entry" } |
如下為 ES 的響應(yīng)體:
HTTP/1.1 200 OK content-encoding: gzip content-length: 143 content-type: application/json; charset=UTF-8 { "_id": "123", "_index": "website", "_primary_term": 2, "_seq_no": 1, "_shards": { "failed": 0, "successful": 1, "total": 2 }, "_type": "blog", "_version": 2, "result": "updated" } |
如上可以看到 _version字段自增了。在內(nèi)部,Elasticsearch 已將舊文檔標記為已刪除,并增加一個全新的文檔。 盡管你不能再對舊版本的文檔進行訪問,但它并不會立即消失。當繼續(xù)索引更多的數(shù)據(jù),Elasticsearch 會在后臺清理這些已刪除文檔。
4,刪除文檔
使用 DELETE 方法來刪除文檔。
DELETE /website/blog/123HTTP/1.1 Accept: */* Accept-Encoding: gzip, deflate Connection: keep-alive Content-Length: 0 Host: localhost:9200 |
ES 返回的響應(yīng)體如下:
HTTP/1.1 200 OK content-encoding: gzip content-length: 143 content-type: application/json; charset=UTF-8 { "_id": "123", "_index": "website", "_primary_term": 2, "_seq_no": 2, "_shards": { "failed": 0, "successful": 1, "total": 2 }, "_type": "blog", "_version": 3, "result": "deleted" } |