Elasticsearch官檔翻譯——5.2 Get API

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)記刪除的文檔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末冰抢,一起剝皮案震驚了整個(gè)濱河市松嘶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挎扰,老刑警劉巖翠订,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異遵倦,居然都是意外死亡尽超,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門梧躺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來似谁,“玉大人,你說我怎么就攤上這事掠哥」ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵续搀,是天一觀的道長(zhǎng)塞琼。 經(jīng)常有香客問我,道長(zhǎng)目代,這世上最難降的妖魔是什么屈梁? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮榛了,結(jié)果婚禮上在讶,老公的妹妹穿的比我還像新娘。我一直安慰自己霜大,他們只是感情好构哺,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般曙强。 火紅的嫁衣襯著肌膚如雪残拐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天碟嘴,我揣著相機(jī)與錄音溪食,去河邊找鬼。 笑死娜扇,一個(gè)胖子當(dāng)著我的面吹牛错沃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雀瓢,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼枢析,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了刃麸?” 一聲冷哼從身側(cè)響起醒叁,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泊业,沒想到半個(gè)月后把沼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脱吱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年智政,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片箱蝠。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡续捂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宦搬,到底是詐尸還是另有隱情牙瓢,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布间校,位于F島的核電站矾克,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏憔足。R本人自食惡果不足惜胁附,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滓彰。 院中可真熱鬧控妻,春花似錦、人聲如沸揭绑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至菇存,卻和暖如春夸研,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背依鸥。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工亥至, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人毕籽。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓抬闯,卻偏偏與公主長(zhǎng)得像井辆,于是被迫代替她去往敵國(guó)和親关筒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容