- Elastic Stack應用寶典
- 田雪松編著
- 1287字
- 2020-07-22 17:21:29
4.3 字段投影
投影(Projection)的概念源于關系型數據庫,是指從一個關系中選取若干個屬性形成一個新的關系。簡單來說,就是在查詢表時不將所有字段返回,而只返回其中的部分字段。Elasticsearch并沒有直接引入投影的概念,但支持類似投影的操作。這主要體現在對查詢結果的_source字段和fields字段的定制上。
4.3.1 _source參數
在第2章2.2.2節中曾經介紹過,Elasticsearch文檔查詢結果中會包含_source元字段,這個字段存儲了文檔的最原始數據。_search接口提供了_source參數,可以定制源文檔中哪些字段出現中_source中。這個參數可以在URI中使用,也可以在請求體中使用。例如在示例4-14中,_source將只包含DestCountry字段的值:


示例4-14 _source參數
如果需要返回多個字段,可以使用數組設置_source,并且可以使用通配符星號“*”。例如下面兩個請求,都將返回OriginCountry和DestCountry字段:

示例4-15 使用數組和星號
當然,使用星號匹配的范圍更大一些,如果索引中包含其他以Country結尾的字段,它們也將出現在返回結果中。類似地,_source也可以設置為false,這將禁止在返回的結果中包含_source源文檔內容,而只包含元字段。除此之外,還可以在_source字段中添加includes和excludes字段,以明確包含和排除字段。例如在示例4-16中,將所有包含lon、lat等經緯度信息的字段包含進來,而又排除了DestLocation的子字段,所以在返回的結果中應該只包含OriginLocation:

示例4-16 includes和excludes
4.3.2 stored_fields參數
除了使用_source字段過濾可以出現在源文檔中的字段以外,還可以使用stored_fields字段指定哪些被存儲的字段出現在結果中。當然這些字段的store屬性要設置為true,否則即使在stored_fields中設置了它們,也會被忽略。例如,在示例4-17中,author字段的store參數為true而title設置為false,則在查詢的結果中將忽略title:

示例4-17 stored_fields
在返回結果中會增加一個fields字段,其中包含了stored_fields中配置的字段值。此外,在使用stored_fields之后,_source字段默認將不會出現在結果中,但可通過將_source參數設置為true讓它返回。字段的store參數在本書第2章2.2.2節也有過介紹,當文檔某字段單獨使用的頻率比較高而其他字段值占用空間又非常大時,就可以把這種常用的字段單獨保存起來使用。
4.3.3 docvalue_fields參數
docvalue_fields也是_search接口的參數,它用于將文檔字段以文檔值機制保存的值返回。文檔值機制是非text類型字段支持的一種在硬盤中保存字段原始值的機制,可通過字段的doc_value參數設置開啟或關閉。這種機制也是在本書第2章2.2.2節講解,詳細介紹請參考該章節。


示例4-18 docvalue_fields
在示例4-18中,docvalue_fields接收的對象有兩個屬性,field定義字段名稱,而format則定義數值和日期的格式。在示例中使用了日期格式epoch_millis,所以返回結果將以毫秒數顯示timestamp字段。format可以使用use_field_mapping關鍵字,它代表的含義是使用字段在索引映射中定義的格式。類似于stored_fields,docvalue_fields查詢的返回結果中也會增加一個fields字段,其中包含了在docvalue_fields中聲明的字段及其文檔值。與stored_fields不同的是,docvalue_fields的返回結果中默認會包含_source字段。所以在示例4-18中使用_source參數過濾了返回結果以保證_source中也只包含timestamp字段。
4.3.4 script_fields參數
script_fields同樣是_search接口的參數,它可以通過腳本向檢索結果中添加字段。與stored_fields和docvalue_fileds類似,通過腳本添加的字段也會出現在結果的fields字段中。默認情況下,使用了script_fields參數后,_source字段也不會出現在返回結果中,但可使用_source參數配置開啟。例如在示例4-19中向返回結果添加了price_per_km字段,它通過AvgTicketPrice字段和DistanceKilometers字段相除而得,反映了機票每公里的平均票價:

示例4-19 script_fields
script_fields中默認使用的腳本也是Painless,可以在這個上下文中使用的變量見表4-3。
表4-3 script_fields可使用腳本變量
