2016-09-01 2 views
1

Ich versuche einige Felder in einer multiMatch Suche gegenüber anderen zu verbessern.Nest MultiMatch Field Boost

Mit Blick auf die docs Ich sehe Sie einen Field mit Boost erstellen können, indem Sie diese

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

Ich habe nicht in der Lage gewesen, um herauszufinden, wie dass, obwohl zu Fields übersetzt.

So etwas ist nicht richtig

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

Muss ich die Zeichenfolge Namen für die Felder verwenden, wie

var titleFieldString = "Title^2"; 

und übergeben diese in Infer.Fields

Antwort

3

Sie die verwenden können, stark typisiert Infer.Field<T>(); Es gibt eine implizite Konvertierung von Field zu Fields, und zusätzliche Felder können mit .And() hinzugefügt werden. Hier ist ein Beispiel

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

ergibt dies

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

Sie können auch eine Reihe von Field geben, die auch implizit konvertiert zu Fields

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

Neben ein Array von Strings

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