官方文檔:Managing Elasticsearch Fields When Searching
要想最大限度提高Elasticsearch的性能,控制搜索要求返回的字段數(shù)量是很重要的。在這1章,我們將講授如何優(yōu)化我們的利用,在每個(gè)搜索結(jié)果中唯一選擇地返回那些我們需要的字段。
在搜索中,使用參數(shù)fields允許限制每個(gè)查詢(xún)命中項(xiàng)(查詢(xún)結(jié)果 hit)返回的列(fields)。這個(gè)特性通常被用來(lái)優(yōu)化大批量數(shù)據(jù)傳輸,當(dāng)Elasticsearch查詢(xún)結(jié)果中有大量返回列時(shí),使其只返回相干的列。固然它聽(tīng)起來(lái)很簡(jiǎn)單(實(shí)際上它確切很簡(jiǎn)單),但是它卻對(duì)性能有極大的影響,查詢(xún)性能與返回文檔的數(shù)量和每個(gè)文檔大小兩個(gè)因素成反比。
斟酌這樣1種情況,當(dāng)每個(gè)文檔的平均大小是20KB,那末每次查詢(xún)要求返回10個(gè)查詢(xún)結(jié)果則是平均200KB的數(shù)據(jù)。如果每秒要求100次,那末我們就需要20M的帶寬。作1個(gè)公道的假定,假設(shè)我們?nèi)绻环祷赜杏玫淖侄?,可以下降文檔大小到800字節(jié),那末每次要求大致就只返回8KB的數(shù)據(jù)量,每秒要求100次則只需要800KB的帶寬。如果想要大范圍使用, 那末保證返回結(jié)果盡量小確切是非常重要且非常實(shí)用的。
默許情況下,開(kāi)啟的是_source字段,它包括的是解析后的文檔內(nèi)容,并會(huì)在每次查詢(xún)后返回。當(dāng)我們其實(shí)不是需要查找并解析文檔所有的內(nèi)容時(shí),我們通過(guò)限制返回的字段(fields)可以節(jié)省寶貴的服務(wù)器CPU時(shí)間和磁盤(pán)IO。上面講到的fields便足以實(shí)現(xiàn)這1點(diǎn)。如果我們需要同時(shí)返回源文檔(document)和1些列(fields),我們可使用參數(shù)_source過(guò)濾,后面將會(huì)介紹它的用法。
關(guān)于fields的另外一個(gè)特性其實(shí)不廣為人知,它也能夠用在查詢(xún)?cè)侄沃校╩etadata-fields)。這里特指用它查詢(xún)_ttl字段的值,它可以在毫秒級(jí)別返回查詢(xún)結(jié)果,而不是查詢(xún)?cè)臋n需要的時(shí)間。這確切是1個(gè)非常實(shí)用的技能。
有些時(shí)候,僅僅查詢(xún)1些簡(jiǎn)單的字段是不夠的,這時(shí)候我們可能需要?jiǎng)討B(tài)地查詢(xún)1些嵌套字段中的數(shù)據(jù)。在這類(lèi)情況下,我們不能使用fields,否則只會(huì)得到下面這樣的失敗信息:
譯者注:這此信息是在Elasticsearch日志中的,1般情況下在控制臺(tái)看不到的。
拋出的這個(gè)異常是由于fields只能用于葉子節(jié)點(diǎn)的數(shù)據(jù)(即:這個(gè)節(jié)點(diǎn)沒(méi)有子節(jié)點(diǎn))。為了能夠加載出非葉子節(jié)點(diǎn),我們需要在查詢(xún)時(shí)使用_source參數(shù),它可以激活過(guò)濾源文檔的特性(它可以用來(lái)過(guò)濾源文檔),下面將詳細(xì)講授。
源文檔過(guò)濾可以在查詢(xún)中控制原始JSON文檔中的哪1部份會(huì)被返回。我們可以設(shè)置包括列或排除列,通過(guò)模式匹配來(lái)過(guò)濾列名的訪(fǎng)問(wèn)路徑便可。請(qǐng)記住,這僅僅可以節(jié)省從查詢(xún)節(jié)點(diǎn)到調(diào)用客戶(hù)真?zhèn)€帶寬,而不能節(jié)省cpu時(shí)間和磁盤(pán)IO,除非使用fields的時(shí)候。這是由于當(dāng)使用源文檔過(guò)濾時(shí),對(duì)每個(gè)查詢(xún)結(jié)果我們依然需要解析源文檔,根據(jù)提供的模式去匹配,以確切返回值中應(yīng)當(dāng)包括這1列,或排除這1列。但是在我們的優(yōu)化計(jì)劃中,它依然是1個(gè)非常重要的方式,并且它使用非常容易,我們可以從它開(kāi)啟優(yōu)化的第1步。
在1.0版本之前,有1個(gè)更廣為人知的查詢(xún)方式――partial fields,現(xiàn)在它已過(guò)時(shí)了,已被本文的源文檔過(guò)濾替換。
后面還有兩段,但是由于我沒(méi)有使用過(guò),所以對(duì)內(nèi)容的翻譯掌握不好。暫時(shí)不翻譯了。
未完待續(xù)……
譯者附:fields和_source的使用方式
其實(shí)沒(méi)甚么區(qū)分,只不過(guò)兩個(gè)的機(jī)制不同,且只有_source支持嵌套類(lèi)型。
希望本文會(huì)對(duì)你有所幫助。