2015-04-06 16 views
7

Próbuję napisać zapytanie, które zwróci mi tylko jedno z pól. W tej chwili przechowuję plik filePath pliku i zawartość pliku, a podczas wyszukiwania chcę przeszukać zawartość, ale zwracam tylko właściwość filePath.ElasticSearch NEST zwraca określone pola

Zaczynam się z tym stwierdzeniem:

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

Które zwraca wyniki w searchResults.Documents same pola i dodanie do niego:

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

I to nie ma nic w searchResults.Documents ale pokazuje liczba trafień poprawnie przy użyciu searchResults.Hits.Total.

klasa plik jest po prostu:

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

ta generuje następujące żądania json:

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

Które gdy prowadził w Sense zwraca wyniki, a kiedy robi searchResults.Hits.Total daje liczbę trafień.

Jednak nie ma zapisów w searchResults.Document IEnumerable.

Czy jest inny sposób, w jaki powinienem zwrócić jedno konkretne pole?

+0

znalazłem rozwiązanie. Tutaj możesz zobaczyć go w innym poście. http://stackoverflow.com/a/32817133/2399279 – ozzimpact

Odpowiedz

11

Użyj pola "źródło", aby określić, które pola chcesz cofnąć. Oto przykładowy kod z mojej aplikacji, który zwraca tylko niektóre pola.

 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) 
     ); 

wtedy dostęp do pól poprzez „źródła” w wyniku:

  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

Udało mi się to zrobić bez konieczności uzyskiwania dostępu do pól za pośrednictwem źródła. – Nived

Powiązane problemy