2016-05-06 4 views
0

У меня есть запрос multiSearch, как показано ниже. В основном я запрашиваю типы продуктов и категорий. Я хотел бы сделать этот запрос необязательным, не перезаписывая тот же код снова. В основном в некоторых случаях я хочу запросить только тип продукта, это означает, что он не будет многопользовательским, а поисковым запросом. Как я могу разделить этот запрос на 2 поисковых запроса. Что-то вроде ниже, я думаю.Nest multisearch query writing как инициализатор объекта Синтаксис

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

что-то вроде этого ниже. Я думаю, что это называется объект инициализатора Синтаксис согласно this статье

Client.MultiSearch (SearchProductQuery & & SearchCategoryQuery)

это возможно?

+0

Какую версию NEST вы используете? Кроме того, какую версию Elasticsearch вы планируете? –

+0

@RussCam Я использую для версии 2.1.0 – batmaci

ответ

2

Это свободно API мульти поиска

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

бы это OIS API мульти поиска

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

Посмотрите на multi search integration tests для другого примера. Я посмотрю, как это добавить к the documentation.

+0

есть ли разница в производительности между ними? Я вижу, что для продукта вы использовали Field.Create для категории Infer.Field ? в чем разница? вы добавили в качестве альтернативы или какой-либо цели? – batmaci

+1

Я просто показал им альтернативные способы получения поля. Строки быстрее, чем выражения, но вы не получаете никакой безопасности типов или простоты рефакторинга ('nameof (Type.Property)' может помочь здесь) –

+0

относительно производительности. Я хотел сравнить свой оригинал с полевым выводом. Действительно ли мой оригинал является полевым выводом? Я прошел через эту ссылку, и он говорит мне, что с C# 6 я могу использовать то же, что и оригинальное. https://www.elastic.co/guide/en/elasticsearch/client/net-api/2.x/field-inference.html#nest-infer – batmaci

Смежные вопросы