get API允許根據其id從索引中獲取類型化的JSON文檔。以下示例從名為twitter的索引中獲取一個JSON文檔,該索引名為_doc為id,值為0:
curl -X GET "localhost:9200/twitter/_doc/0"
上述get操作的結果是:
{ "_index" : "twitter", "_type" : "_doc", "_id" : "0", "_version" : 1, "_seq_no" : 10, "_primary_term" : 1, "found": true, "_source" : { "user" : "kimchy", "date" : "2009-11-15T14:12:12", "likes": 0, "message" : "trying out Elasticsearch" } }
上述結果包括檢索文檔的_index,_type,_id,和_version ,包括實際文檔的_source 文檔。
2.實時性
默認情況下,get API是實時的,並且不受索引刷新率的影響。
如果文檔已更新但尚未刷新,則get API將就地發出刷新調用以使文檔可見。
這也將使上次刷新后其他文檔發生變化。為了禁用實時GET,可以將realtime參數設置為false。
3.源過濾
默認情況下,除非您使用了stored_fields參數或_source禁用了該字段,否則get操作將返回_source字段的內容。您可以_source使用以下_source參數關閉檢索:
curl -X GET "localhost:9200/twitter/_doc/0?_source=false"
如果您只需要完整的一個或兩個字段,則_source可以使用_source_includes 和_source_excludes參數來包含或過濾掉您需要的部分。
這對於大型文檔尤其有用,其中部分檢索可以節省網絡開銷。這兩個參數都使用逗號分隔的字段列表或通配符表達式。例:
curl -X GET "localhost:9200/twitter/_doc/0?_source_includes=*.id&_source_excludes=entities"
如果您只想指定包含,則可以使用較短的表示法:
curl -X GET "localhost:9200/twitter/_doc/0?_source=*.id,retweeted"
4.存儲的字段
get操作允許指定將通過傳遞stored_fields參數返回的一組存儲字段。如果未存儲請求的字段,則將忽略它們。例如,考慮以下映射:
curl -X PUT "localhost:9200/twitter" -H 'Content-Type: application/json' -d' { "mappings": { "_doc": { "properties": { "counter": { "type": "integer", "store": false }, "tags": { "type": "keyword", "store": true } } } } } '
現在我們可以添加一個文檔:
curl -X PUT "localhost:9200/twitter/_doc/1" -H 'Content-Type: application/json' -d' { "counter" : 1, "tags" : ["red"] } '
然后嘗試檢索它:
curl -X GET "localhost:9200/twitter/_doc/1?stored_fields=tags,counter"
上述get操作的結果是:
{ "_index": "twitter", "_type": "_doc", "_id": "1", "_version": 1, "_seq_no" : 22, "_primary_term" : 1, "found": true, "fields": { "tags": [ "red" ] } }
從文檔本身獲取的字段值始終作為數組返回。由於該counter字段未存儲,因此get請求在嘗試獲取時直接忽略它
也可以檢索字段之類的元數據字段_routing:
curl -X PUT "localhost:9200/twitter/_doc/2?routing=user1" -H 'Content-Type: application/json' -d' { "counter" : 1, "tags" : ["white"] } '
curl -X GET "localhost:9200/twitter/_doc/2?routing=user1&stored_fields=tags,counter"
上述get操作的結果是:
{ "_index": "twitter", "_type": "_doc", "_id": "2", "_version": 1, "_seq_no" : 13, "_primary_term" : 1, "_routing": "user1", "found": true, "fields": { "tags": [ "white" ] } }
此外,只有葉子字段可以通過stored_field選項返回。因此無法返回對象字段,此類請求將失敗。
5.直接獲取_source
使用/{index}/{type}/{id}/_source端點只獲取_source文檔的字段,而不包含任何其他內容。例如:
curl -X GET "localhost:9200/twitter/_doc/1/_source"
6.路由
使用控制路由的能力進行索引時,為了獲取文檔,查詢時需要提供相同的路由值。例如
curl -X GET "localhost:9200/twitter/_doc/2?routing=user1"
以上將獲得帶有id的推文2,但將根據用戶進行路由。請注意,在沒有正確路由的情況下發出get將導致無法獲取文檔。
7.查詢偏好設置
控制選擇哪個分片副本執行get請求。默認情況下,操作在分片復制副本之間隨機化。
該preference可設置為:
-
_primary - 該操作將僅在主分片上執行。
-
_local - 如果可能,操作將優選在本地分配的分片上執行。
- 自定義(字符串)值
-
將使用自定義值來保證相同的分片將用於相同的自定義值。
8.刷新
可以在get之前將refresh設置為true,保證可搜索到最新數據。設置true應該是在經過仔細考慮和驗證后,這會導致系統負載過重(並減慢索引)。
9.分布式
get操作被散列為特定的分片ID。然后它被重定向到該分片ID中的一個副本並返回結果。副本可以是主分片或其分片副本。這意味着我們擁有的副本越多,我們將擁有更好的GET縮放。
10.版本控制支持
version僅當文檔的當前版本等於指定的版本時,才可以使用該參數檢索文檔。對於所有版本類型,此行為都是相同的,
在內部,Elasticsearch將舊文檔標記為已刪除並添加了一個全新的文檔。舊版本的文檔不會立即消失,但您將無法訪問它。當您繼續索引更多數據時,Elasticsearch會在后台清除已刪除的文檔。
