2016-09-01 2 views
1

Я пытаюсь увеличить некоторые поля над другими в поиске нескольких элементов.Nest MultiMatch Field Boost

Глядя на документы я вижу, вы можете создать Field с усилением, делая это

var titleField = Infer.Field<Page>(p => p.Title, 2); 

Я не был в состоянии понять, как это переводится Fields хотя.

Что-то, как это не так

var bodyField = Infer.Field<Page>(p => p.Body); 
var titleField = Infer.Field<Page>(p => p.Title, 2); 
var metaDescriptionField = Infer.Field<Page>(p => p.MetaDescription, 1.5); 
var metaKeywordsField = Infer.Field<Page>(p => p.Keywords, 2); 

MultiMatchQuery multiMatchQuery = new MultiMatchQuery() 
{ 
    Fields = Infer.Fields<Page>(bodyField, titleField, metaDescriptionField, metaKeywordsField), 
      Query = search.Term 
}; 

мне нужно использовать имена строк для полей как

var titleFieldString = "Title^2"; 

и передавать их в Infer.Fields

ответ

3

Вы можете использовать Do строго типизированный Infer.Field<T>(); существует неявное преобразование от Field до Fields, а дополнительные поля могут быть добавлены с помощью .And(). Вот пример

void Main() 
{ 
    var client = new ElasticClient(); 

    Fields bodyField = Infer.Field<Page>(p => p.Body); 
    var titleField = Infer.Field<Page>(p => p.Title, 2); 
    var metaDescriptionField = Infer.Field<Page>(p => p.MetaDescription, 1.5); 
    var metaKeywordsField = Infer.Field<Page>(p => p.Keywords, 2); 

    var searchRequest = new SearchRequest<Page>() 
    { 
     Query = new MultiMatchQuery() 
     { 
      Fields = bodyField 
         .And(titleField) 
         .And(metaDescriptionField) 
         .And(metaKeywordsField), 
      Query = "multi match search term" 
     } 
    }; 

    client.Search<Page>(searchRequest); 
} 

public class Page 
{ 
    public string Body { get; set; } 
    public string Title { get; set; } 
    public string MetaDescription { get; set; } 
    public string Keywords { get; set; } 
} 

это дает

{ 
    "query": { 
    "multi_match": { 
     "query": "multi match search term", 
     "fields": [ 
     "body", 
     "title^2", 
     "metaDescription^1.5", 
     "keywords^2" 
     ] 
    } 
    } 
} 

Вы также можете передать массив Field, который неявно преобразует Fields

var searchRequest = new SearchRequest<Page>() 
{ 
    Query = new MultiMatchQuery() 
    { 
     Fields = new[] { 
      bodyField, 
      titleField, 
      metaDescriptionField, 
      metaKeywordsField 
     }, 
     Query = "multi match search term" 
    } 
}; 

Как передать массив строк

var searchRequest = new SearchRequest<Page>() 
{ 
    Query = new MultiMatchQuery() 
    { 
     Fields = new[] { 
      "body", 
      "title^2", 
      "metaDescription^1.5", 
      "keywords^2" 
     }, 
     Query = "multi match search term" 
    } 
};