2016-07-02 9 views
0

Обновление с NEST 1.6.2 до 2.3.3.Каковы эквивалентные типы для FunctionScoreFunctionsDescriptor & FunctionScoreFunction в 2.3.3

Что нового типа для FunctionScoreFunctionsDescriptor и FunctionScoreFunction в NEST 2.3.3?

Они FunctionScoreFunctionsDescriptor ->ScoreFunctionsDescriptor и FunctionScoreFunction ->ScoreFunctionsDescriptor?

Если это так, то мы строим var functionScores = new List<Func<ScoreFunctionsDescriptor<IndexData>, ScoreFunctionsDescriptor<Property>>>(), но как передать это вниз

var searchDescriptor = new SearchDescriptor<IndexData>() .Paged(pageable) .Query(q => q .FunctionScore(fs => fs.Functions(***How do we pass the functionScores***));

Можем ли мы построить его, как показано ниже?

functionScores.ForEach(f => searchDescriptor.Query(q => q.FunctionScore(fc => fc.Functions(f))));

ответ

1

function_score запроса может принимать либо IEnumerable<IScoreFunction> или Func<ScoreFunctionsDescriptor<T>, IPromise<IList<IScoreFunction>>> то есть функция, которая принимает дескриптор оценки и возвращает список функций. А ScoreFunctionsDescriptor<T> реализует IPromise<IList<IScoreFunction>>

Основываясь на этом, если мы хотим объединить кучу функций вместе, мы можем агрегировать над кучей функций, которые принимают ScoreFunctionsDescriptor<T> и возвращают ScoreFunctionsDescriptor<T>

public class Document 
{ 
    public string Name { get; set;} 
    public GeoLocation Location { get; set;} 
} 

var functions = new List<Func<ScoreFunctionsDescriptor<Document>, ScoreFunctionsDescriptor<Document>>> 
{ 
    s => s.FieldValueFactor(fvf => fvf 
     .Field(f => f.Name).Weight(3)), 
    s => s.ExponentialGeoLocation(geo => geo 
     .Field(f => f.Location) 
     .Offset("1km") 
     .Origin(new GeoLocation(-33.87189, 151.21623)) 
     .Scale("2km") 
    ) 
}; 

client.Search<Document>(s => s 
    .Query(q => q 
     .FunctionScore(fs => fs 
      .Functions(sc => functions.Aggregate(sc, (a,f) => f(a))) 
     ) 
    ) 
); 

, который в этом примере

{ 
    "query": { 
    "function_score": { 
     "functions": [ 
     { 
      "field_value_factor": { 
      "field": "name" 
      }, 
      "weight": 3.0 
     }, 
     { 
      "exp": { 
      "location": { 
       "origin": { 
       "lat": -33.87189, 
       "lon": 151.21623 
       }, 
       "scale": "2.0km", 
       "offset": "1.0km" 
      } 
      } 
     } 
     ] 
    } 
    } 
}