2016-05-06 6 views
0

Ich habe eine MultiSearch-Abfrage wie folgt. Grundsätzlich frage ich nach Produkt- und Kategorietypen. Ich möchte diese Abfrage optional machen, ohne den gleichen Code erneut zu schreiben. Grundsätzlich möchte ich in einigen Fällen nur den Produkttyp abfragen, das heißt, es wird nicht multisearch sondern eine Suchanfrage. Wie kann ich diese Abfrage in 2 Suchabfragen aufteilen? Etwas wie unten, denke ich.Nest Multisearch Abfrage schreiben als Objektinitialisierer Syntax

return Client.MultiSearch(ms => ms 
     .Search<Product>("products", s => s 
     .Index(IndexName) 
     .Explain(explain) 
      .Query(q => q 
      .Bool(b => b 
       .Should(
        sh => sh.MultiMatch(qs => qs 
         .Fields(d => d       
          .Field(Name + ".raw", NameBoost + 0.5) 
          .Field(Name, NameBoost)        
          .Type(TextQueryType.BestFields) 
          .Query(key)) 
          ))).From(startfrom).Size(size)) 
.Search<Category>("categories", s => s 
.Index(IndexName) 
.Explain(explain) 
.Query(q => q. 
Bool(b => b. 
Should(sh => sh. 
MultiMatch(m => m 
.Fields(d => d 
.Field(f => f.Name, NameBoost) 
.Field(p => p.Name.Suffix("raw"), NameBoost + 0.5)).Type(TextQueryType.BestFields) 
.Query(key) 
) 
))).From(startfrom).Size(size)) 
); 

so etwas wie das unten. Ich denke, dass es Objektinitialisierer Syntax nach this Artikel

Client.MultiSearch (SearchProductQuery & & SearchCategoryQuery)

ist es möglich, genannt wird?

+0

Welche Version von NEST verwenden Sie? Auf welche Version von Elasticsearch zielen Sie auch ab? –

+0

@RussCam Ich verwende für beide Version 2.1.0 – batmaci

Antwort

2

Diese fließend API Multi Suche

client.MultiSearch(ms => ms 
    .Search<Product>("products", s => s 
     .Index(IndexName) 
     .Explain(explain) 
     .Query(q => q 
      .Bool(b => b 
       .Should(sh => sh 
        .MultiMatch(qs => qs 
         .Fields(d => d 
          .Field(Name + ".raw", NameBoost + 0.5) 
          .Field(Name, NameBoost) 
         ) 
         .Type(TextQueryType.BestFields) 
         .Query(key) 
        ) 
       ) 
      ) 
     ) 
     .From(startfrom) 
     .Size(size) 
    ) 
    .Search<Category>("categories", s => s 
     .Index(IndexName) 
     .Explain(explain) 
     .Query(q => q 
      .Bool(b => b 
       .Should(sh => sh 
        .MultiMatch(m => m 
         .Fields(d => d 
          .Field(f => f.Name, NameBoost) 
          .Field(p => p.Name.Suffix("raw"), NameBoost + 0.5) 
         ) 
         .Type(TextQueryType.BestFields) 
         .Query(key) 
        ) 
       ) 
      ) 
     ) 
     .From(startfrom) 
     .Size(size) 
    ) 
); 

wäre dies OIS Multi API Suche

var multiSearch = new MultiSearchRequest 
{ 
    Operations = new Dictionary<string, ISearchRequest> 
    { 
     { "products", new SearchRequest<Product>(IndexName) 
      { 
       Explain = true, 
       Query = new BoolQuery 
       { 
        Should = new QueryContainer[] { 
         new MultiMatchQuery 
         { 
          Fields = 
           ((Fields)Field.Create(Name + ".raw", NameBoost + 0.5)) 
           .And(Name, NameBoost), 
          Type = TextQueryType.BestFields, 
          Query = key 
         } 
        } 
       }, 
       From = startfrom, 
       Size = size 
      } 
     }, 
     { "categories", new SearchRequest<Category>(IndexName) 
      { 
       Explain = true, 
       Query = new BoolQuery 
       { 
        Should = new QueryContainer[] { 
         new MultiMatchQuery 
         { 
          Fields =  
           ((Fields)Infer.Field<Category>(f => f.Name, NameBoost)) 
           .And<Category>(f => f.Name.Suffix("raw"), NameBoost + 0.5), 
          Type = TextQueryType.BestFields, 
          Query = key 
         } 
        } 
       }, 
       From = startfrom, 
       Size = size 
      } 
     }, 
    } 
}; 

client.MultiSearch(multiSearch); 

Werfen Sie einen Blick auf die multi search integration tests für ein anderes Beispiel. Ich werde sehen, wie das zu the documentation hinzugefügt wird.

+0

gibt es irgendwelche Leistungsunterschiede zwischen ihnen? Ich sehe, dass Sie für das Produkt Field.Create für die Kategorie Infer.Field verwendet haben? Was ist der Unterschied? Sie als Alternative oder zu irgendeinem Zweck hinzugefügt? – batmaci

+1

Ich zeigte sie nur als alternative Möglichkeiten, ein Feld zu bekommen. Zeichenfolgen sind schneller als Ausdrücke, aber Sie erhalten weder eine Typsicherheit noch eine einfache Umgestaltung ('nameof (Type.Property)' kann hier helfen) –

+0

bezüglich der Leistung. Ich wollte mein Original mit der Feldschlussfolgerung vergleichen. Ist mein Original eigentlich auch eine Feldschlussfolgerung? Ich bin durch diesen Link gegangen und es sagt mir, dass ich mit C# 6 kann genau wie meine ursprüngliche verwenden. https://www.elastic.co/guide/en/elasticsearch/client/net-api/2.x/field-inference.html#nest-infer – batmaci

Verwandte Themen