2015-04-06 72 views
7

我正試圖編寫一個查詢,只會回覆其中一個字段。現在我正在存儲文件的filePath和文件的內容,並且在我的搜索中我想根據內容進行搜索,但只返回filePath。ElasticSearch NEST返回特定字段

我開始有這樣的說法:

var searchResults = client.Search<File>(
     s => s.Query(q => q.Wildcard(w => w.Value("*" + genre + "*").OnField("fileContents"))).AllIndices().AllTypes()); 

其中在searchResults.Documents返回結果,並添加點域到它:

var searchResults = client.Search<File>(
     s => s.Query(q => q.Wildcard(w => w.Value("*" + genre + "*").OnField("fileContents"))).AllIndices().AllTypes().Fields(f=>f.filePath)); 

而且它沒有任何東西searchResults.Documents,但它顯示正確使用的點擊次數爲searchResults.Hits.Total

文件類只是:

public class File 
{ 
    public string filePath { get; set; } 
    public string fileContents { get; set; } 
} 

這將生成以下JSON請求:

{ 
"fields": [ 
"filePath" 
], 
"query": { 
    "wildcard": { 
    "fileContents": { 
     "value": "*int*" 
     } 
    } 
    } 
} 

,當在檢測結果返回跑去做searchResults.Hits.Total時給出的點擊次數。

但是,在0123nIEnumerable中沒有記錄。

有沒有不同的方式,我應該返回一個特定的領域?

+0

我找到了解決辦法。在這裏你可以在另一篇文章中看到它。 http://stackoverflow.com/a/32817133/2399279 – ozzimpact

回答

11

使用「源」字段指定要撤回的字段。以下是我的應用程序中僅返回一些字段的示例代碼。

 var searchResults = ElasticClient.Search<AuthForReporting>(s => s 
      .Size(gridSortData.PageSize) 
      .From(gridSortData.PageIndex * gridSortData.PageSize) 
      .Sort(sort) 
      .Source(sr => sr 
       .Include(fi => fi 
        .Add(f => f.AuthEventID) 
        .Add(f => f.AuthResult.AuthEventDate) 
        .Add(f => f.AuthInput.UID) 
        .Add(f => f.AuthResult.CodeID) 
        .Add(f => f.AuthResult.AuthenticationSuccessful) 
        .Add(f => f.AuthInput.UserName) 
        .Add(f => f.AuthResult.ProductID) 
        .Add(f => f.AuthResult.ProductName) 
        .Add(f => f.AuthInput.AuthType) 
        .Add(f => f.AuthResult.Address.City) 
        .Add(f => f.AuthResult.Address.State) 
        .Add(f => f.AuthResult.Address.CountryCode) 
        .Add(f => f.AuthResult.RulesFailed) 
       ) 
      ) 
      .Query(query) 
     ); 

你然後在結果通過「源」訪問字段:

  var finalResult = from x in searchResults.Hits 
        select new AlertListRow 
          { 
           AlertCode = x.Source.AlertCode, 
           AlertDate = x.Source.AlertDate, 
           AlertID = x.Id, 
           AlertSummary = x.Source.Subject, 
           AlertMessage = x.Source.Body 
          }; 
+0

我能夠做到這一點,而無需通過源訪問字段。 – Nived