Version:5.xhtml
英文原文地址:Selecting fields to returnc#
有時候,不須要讓 Elasticsearch 返回查詢的文檔中的所有字段。舉個栗子,當展現最近發佈的博客時,在查找到最新的帖子後只須要返回博客的標題。api
有兩種方法能夠用來返回文檔中的部分字段,即部分文檔(咱們使用這個術語來描述)。一個是 stored fields
,另外一個是 source filtering
,二者在工做方式上有很大的不一樣。elasticsearch
索引文檔時,默認狀況下,Elasticsearch 將最初發送的 JSON 文檔存儲在一個名叫 _source
的特殊字段中。從搜索查詢返回的文檔是 Elasticsearch 返回的每一個命中的 _source
字段的具體化。ide
還能夠在映射的時候使用 store
,把 JSON 文檔中的字段分別存儲在 Elasticsearch 中。爲何要這麼作呢?你可能禁用了 _source
以便不存儲源文檔,並選擇存儲特定的字段。另外一種可能性是,_source
包含一個具備較大值的字段(例如一篇博客的正文),但一般只須要另外一個字段(例如博客的標題)。這種狀況下,咱們不想爲了獲得一個小字段而反序列化整個 _source
。ui
重要:選擇禁用類型映射中的
_source
,意味着不存儲發送到 Elasticsearch 的原始 JSON 文檔,所以永遠沒法檢索原始文檔。雖然這樣作能夠節省磁盤空間,但與此同時某些功能(如 Reindex API 或者 highlighting)也將沒法正常工做。code必定要認真考慮,禁用源文檔是否真的符合你的需求。htm
以這種方式存儲字段時,可使用搜索請求的 .StoredFields()
方法來指定須要返回的字段對象
var searchResponse = client.Search<Project>(s => s .StoredFields(sf => sf .Fields( f => f.Name, f => f.StartedOn, f => f.Branches ) ) .Query(q => q .MatchAll() ) );
使用響應對象的 .Fields
屬性檢索它們索引
foreach (var fieldValues in searchResponse.Fields) { var document = new { Name = fieldValues.ValueOf<Project, string>(p => p.Name), StartedOn = fieldValues.Value<DateTime>(Infer.Field<Project>(p => p.StartedOn)), Branches = fieldValues.Values<Project, string>(p => p.Branches.First()) }; }
這種方法在單獨存儲字段時有效。然而,更常見的狀況是從 _source
中返回選擇的字段。這即是 source filtering
的由來。
搜索查詢時使用 source filtering 能夠返回文檔的部分字段
var searchResponse = client.Search<Project>(s => s .Source(sf => sf .Includes(i => i .Fields( f => f.Name, f => f.StartedOn, f => f.Branches ) ) .Excludes(e => e .Fields("num*") ) ) .Query(q => q .MatchAll() ) );
在請求中指定了源過濾以後,響應對象的 .Documents
就只包含部分文檔了、
var partialProjects = searchResponse.Documents;
你也能夠從查詢中徹底排除 _source
searchResponse = client.Search<Project>(s => s .Source(false) .Query(q => q .MatchAll() ) );