- 文章名稱:Elasticsearch Reference[2.2]
- 原文地址:https://www.elastic.co/guide/en/elasticsearch/reference/2.2/docs-get.html
- 譯者:code4j
Get API
get api 支持通過 ID 返回一個(gè) JSON 格式的文檔怕轿。下面的例子是從 twitter 索引下的 tweet type 中獲取 ID 為1的文檔:
curl -XGET 'http://localhost:9200/twitter/tweet/1'
返回結(jié)果如下:
{
"_index" : "twitter",
"_type" : "tweet",
"_id" : "1",
"_version" : 1,
"found": true,
"_source" : {
"user" : "kimchy",
"postDate" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}
}
上面的結(jié)果中包含了文檔的 _index
,_type
,_id
,_version
等我們希望獲取的字段税灌,包括 _source
字段托呕,如果文檔能被找到的話(通過返回結(jié)果中的 found
字段表明)扯键。
這個(gè) API 還能使用 HTTP 的 HEAD
請(qǐng)求,例如:
curl -XHEAD -i 'http://localhost:9200/twitter/tweet/1'
實(shí)時(shí)性
默認(rèn)情況下禀综,get API 是實(shí)時(shí)的,而且不會(huì)受索引刷新頻率的影響(文檔在索引中是否能被檢索到)羽历。(譯者批注:譯者注意了一下6.0的文檔和代碼稽犁。代碼中2.2版本是在實(shí)時(shí)狀態(tài)下走 translog 讀取的,translog是在數(shù)據(jù)寫入 index-buffer 的時(shí)候一并記錄的,所以不管是否 refresh 都能從 translog 得到陨帆;在6.0中則是實(shí)時(shí)狀態(tài)下曲秉,直接發(fā)起了一次刷新請(qǐng)求,確保文檔寫入 操作系統(tǒng)緩存歧譬,就可以被檢索到了)
如果你想取消實(shí)時(shí)性 GET 的話岸浑,一個(gè)辦法是請(qǐng)求時(shí)設(shè)置 realtime
參數(shù)為 false
,或者通過節(jié)點(diǎn)級(jí)全局配置參數(shù) action.get.realtime
設(shè)置為 false
。
當(dāng)獲取一個(gè)文檔時(shí)瑰步,可以設(shè)置獲取確切的屬性 fields
。一般來說這些字段可能是被存儲(chǔ)的(mapping 中設(shè)置字段為 stored)璧眠,當(dāng)使用實(shí)時(shí)的 GET 操作的時(shí)候缩焦,沒有stored字段的概念(一段時(shí)間內(nèi)读虏,基本上一次flush的時(shí)間),而是直接從source字段中提取這些字段(即使source被禁用)(譯者批注:這句話有一定的迷惑性袁滥,譯者開始以為原文的意思是 即使禁用了也能從source取出盖桥,而作者的意思是不管你的 store 是不是 true,都去source 字段里面讀题翻,也就是說如果你source字段禁用了揩徊,get 是取不到任何數(shù)據(jù)的。)嵌赠。實(shí)時(shí) GET 的時(shí)候比較好的做法是從source拿字段塑荒,不管屬性有沒有被存儲(chǔ)。(實(shí)際上如果字段被存儲(chǔ)了姜挺,就不會(huì)走source了齿税,直接去 Lucene 的倒排索引拿,字段多的時(shí)候IO開銷比較厲害炊豪,所以應(yīng)該是讀者的建議凌箕,默認(rèn) store 即可,除非你的字段很大词渤,但是不多)
可選的類型
Get API 允許使用 _type
字段牵舱,如果指定 _all
可以查詢所有的類型。
(**譯者批注:感覺用處不大缺虐,5.0以后開始淡化 type 的概念了仆葡,現(xiàn)在基本上一個(gè)索引一個(gè) type **)
source過濾
默認(rèn)情況下,Get 操作會(huì)返回 source 的全部?jī)?nèi)容志笼,除非你指定了 fields
參數(shù)或者 _source
字段被禁用沿盅。你可通過設(shè)置 _source
字段禁止返回source中的內(nèi)容:
curl -XGET 'http://localhost:9200/twitter/tweet/1?_source=false'
如果你只需要 _source
中一兩個(gè)字段,你可以使用 _source_include
或者 _source_exclude
參數(shù)設(shè)置包含或者過濾你需要的字段纫溃。這個(gè)在文檔很大的時(shí)候可以節(jié)省網(wǎng)絡(luò)開銷腰涧。這兩個(gè)參數(shù)都可以通過都好分割或使用通配符,例如:
curl -XGET 'http://localhost:9200/twitter/tweet/1?_source_include=*.id&_source_exclude=entities'
如果你只想指定包含字段的花紊浩,可以使用更短的聲明:
curl -XGET 'http://localhost:9200/twitter/tweet/1?_source=*.id,retweeted'
字段
Get 操作可以通過參數(shù) fileds
指定返回一組設(shè)置存儲(chǔ)(store
)的字段窖铡。例如:
curl -XGET 'http://localhost:9200/twitter/tweet/1?fields=title,content'
為了向后兼容,如果請(qǐng)求中的字段并沒有被存儲(chǔ)坊谁,他們將從 _source
字段獲确驯恕(解析并獲取)口芍,所以這個(gè)功能被 source 過濾取代了箍铲。
字段值總是以數(shù)組的形式返回,原數(shù)組字段例如 _routing
就不會(huì)用數(shù)組格式返回鬓椭。
(這個(gè)原因大概是因?yàn)榈吆铮琫lasticsearch 本身就支持多值字段关划,這種情況下 多值字段中只有一個(gè)值的時(shí)候它并不知道這個(gè)到底是不是多值的,所以干脆都給你數(shù)組)
當(dāng)然只有葉子節(jié)點(diǎn)的字段能通過 field
字段返回翘瓮,所以對(duì)象類型的字段不可以返回并且這樣的請(qǐng)求會(huì)報(bào)錯(cuò)贮折。
生成字段
如果在索引后沒有執(zhí)行刷新請(qǐng)求,那么 Get 操作將會(huì)走 transaction log(譯者批注:類似 mysql 的 redolog资盅,后面的文章會(huì)做介紹) 獲取文檔调榄,當(dāng)然,有些字段是在索引期生成的呵扛,如果你試圖訪問這種字段每庆,可能會(huì)報(bào)異常。你可以通過 配置 ignore_errors_on_generated_fields
參數(shù)忽略它們择份。
直接獲取 _source
使用 /{index}/{type}/{id}/_source
來獲取文檔中的 source扣孟,不包含其他的元數(shù)據(jù)信息,例如:
curl -XGET 'http://localhost:9200/twitter/tweet/1/_source'
你也可以通過 source 過濾 控制返回你需要的 source 的部分:
curl -XGET 'http://localhost:9200/twitter/tweet/1/_source?_source_include=*.id&_source_exclude=entities'
注意荣赶,_source
方式也可以通過使用 HTTP 的 HEAD 請(qǐng)求方法判斷文檔是否存在凤价,例如:
curl -XHEAD -i 'http://localhost:9200/twitter/tweet/1/_source'
路由
當(dāng)索引文檔的時(shí)候使用了路由,獲取文檔的時(shí)候也必須要提供路由值拔创,例如:
curl -XGET 'http://localhost:9200/twitter/tweet/1?routing=kimchy'
上面的例子將能獲取到文檔id為1的tweet利诺,但是會(huì)根據(jù)用戶名路由。注意剩燥,如果沒有提供正確的路由信息慢逾,就無法獲取到文檔
(譯者批注:默認(rèn)路由值是 ID ,路由值是 ID 的時(shí)候灭红,GET 不加路由也沒能獲取到侣滩;如果分片只有一個(gè)的情況下 GET 也可以不提供路由,因?yàn)闊o論怎么算都只能路由到這一個(gè)分片)
偏好
通過控制 preference
參數(shù)控制 get 請(qǐng)求去哪個(gè)分片上執(zhí)行变擒。默認(rèn)情況下請(qǐng)求隨機(jī)選擇分片執(zhí)行君珠。
preference
可選的參數(shù)有:
primary
- 請(qǐng)求只在主分片執(zhí)行。_local
- 操作會(huì)優(yōu)先在本地節(jié)點(diǎn)有的分片中查詢娇斑,沒有的話再在其它節(jié)點(diǎn)查詢.自定義值(字符串) - 使用自定義的值來保證同一個(gè)值的數(shù)據(jù)策添,在同一個(gè) shard 里面。一般可以使用網(wǎng)站的session id或者用戶名
(譯者批注:自定義值有點(diǎn)類似路由毫缆,搜索 API 也能用)
刷新
可以在 get 操作設(shè)置 refresh
參數(shù)為 true
刷新相關(guān)的分片唯竹,以確保文檔能夠搜索到。設(shè)置這個(gè)參數(shù)為 true
需要注意驗(yàn)證是否會(huì)導(dǎo)致系統(tǒng)負(fù)載過高(以及降低索引速度)苦丁。
(譯者批注:refresh 會(huì)帶來額外的 IO 開銷)
分布式
get 操作會(huì)計(jì)算一個(gè)哈希值指定一個(gè)分片 id 浸颓,然后 get 請(qǐng)求會(huì)被重定向到其中一個(gè)等于上述 id 分片集合上。分片集合指的是包括這個(gè) id 的主分片和副本,也就是說我們的分片越多猾愿,GET 請(qǐng)求的水平擴(kuò)展力越好鹦聪。
版本支持
你可以使用 version
參數(shù)指定獲取文檔账阻,前提是當(dāng)前文檔版本等于你參數(shù)的版本蒂秘。除了 FORCE
類型的版本控制類型對(duì)于所有的類型都是相同的。
在 elasticsearch 內(nèi)部淘太,它標(biāo)記了舊文檔刪除并增加了一個(gè)新文檔姻僧,舊版本的文檔不會(huì)立馬消失,當(dāng)然你也無法訪問到蒲牧,隨著你索引更多地?cái)?shù)據(jù)撇贺,elasticsearch 在底層會(huì)清理標(biāo)記刪除的文檔。