2013-10-01 17 views
5

Pracuję nad poniższym kodem, a to, co chcę zrobić, to zapytanie o obiekt.Elastic search with Nest

Na przykład: Mam formularz wyszukiwania, który wypełnia pola obiektów, takie jak poniżej. Następnie chcę przeszukać wyszukiwanie elastyczne na podstawie dowolnego użytkownika wypełnionego formularzem.

tj: poniżej, chcę zapytać o indeks według obiektu searchItem. Jak mogę to łatwo zrobić?

class Program 
{ 
    static void Main(string[] args) 
    { 
     var p = new Program(); 

     var item1 = new Announcement() {Id=1, Title = "john", ContentText = "lorem", Bar = false, Num = 99, Foo = "hellow"}; 

     //p.Index(item1, "add"); 

     var searchItem = new Announcement() {Title="john",Num=99}; 

     ElasticClient.Search<Announcement>(); 

     Console.Read(); 

    } 

    public void Index(Announcement announcement, String operation) 
    { 
     var uriString = "http://localhost:9200"; 
     var searchBoxUri = new Uri(uriString); 

     var settings = new ConnectionSettings(searchBoxUri); 
     settings.SetDefaultIndex("test"); 

     var client = new ElasticClient(settings); 

     if (operation.Equals("delete")) 
     { 
      client.DeleteById("test", "announcement", announcement.Id); 
     } 
     else 
     { 
      client.Index(announcement, "test", "announcement", announcement.Id); 
     } 
    } 

    private static ElasticClient ElasticClient 
    { 
     get 
     { 
      try 
      { 
       var uriString = "http://localhost:9200"; 
       var searchBoxUri = new Uri(uriString); 
       var settings = new ConnectionSettings(searchBoxUri); 
       settings.SetDefaultIndex("test"); 
       return new ElasticClient(settings); 
      } 
      catch (Exception) 
      { 
       throw; 
      } 
     } 
    } 
} 

Odpowiedz

5

Nie możesz :)

NEST nie można wywnioskować, jak najlepiej kwerendy oparte jedynie na częściowo wypełnionej POCO. Czy OR lub AND powinien wykonać zagnieżdżone zapytanie terminowe lub zapytanie terminowe owinięte w has_child? Łapiesz mój dryf.

Nest ma zręczny funkcję o nazwie kwerend conditionless które pozwolą Ci pisać do całego zapytania tak:

ElasticClient.Search<Announcement>(s=>s 
    .Query(q=> 
     q.Term(p=>p.Title, searchItem.Title) 
     && q.Term(p=>p.Num, searchItem.Num) 
     //Many more queries use() to group all you want 
    ) 
) 

Kiedy NEST widzi, że argument przekazany do Term jest zerowy lub opróżnić go po prostu przyzwyczajenie czynią to część zapytania.

Więcej informacji na temat działania tej funkcji: http://nest.azurewebsites.net/concepts/writing-queries.html

+0

dzięki za szybki monit. zajrzy do twoich dokumentów. – helloworld

Powiązane problemy