NEST - 返回部分文檔

Selecting fields to return

Version:5.xhtml

英文原文地址:Selecting fields to returnc#

有時候,不須要讓 Elasticsearch 返回查詢的文檔中的所有字段。舉個栗子,當展現最近發佈的博客時,在查找到最新的帖子後只須要返回博客的標題。api

有兩種方法能夠用來返回文檔中的部分字段,即部分文檔(咱們使用這個術語來描述)。一個是 stored fields ,另外一個是 source filtering ,二者在工做方式上有很大的不一樣。elasticsearch

Stored fields

索引文檔時,默認狀況下,Elasticsearch 將最初發送的 JSON 文檔存儲在一個名叫 _source 的特殊字段中。從搜索查詢返回的文檔是 Elasticsearch 返回的每一個命中的 _source 字段的具體化。ide

還能夠在映射的時候使用 store ,把 JSON 文檔中的字段分別存儲在 Elasticsearch 中。爲何要這麼作呢?你可能禁用了 _source 以便不存儲源文檔,並選擇存儲特定的字段。另外一種可能性是,_source 包含一個具備較大值的字段(例如一篇博客的正文),但一般只須要另外一個字段(例如博客的標題)。這種狀況下,咱們不想爲了獲得一個小字段而反序列化整個 _sourceui

重要:選擇禁用類型映射中的 _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

搜索查詢時使用 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()
    )
);
相關文章
相關標籤/搜索