2015-07-21 5 views
0

Я пытаюсь создать запрос функции elessearch function_score, используя функцию NEST (функция gauss), и иметь объект геоточечного объекта для передачи как «origin», однако метод «Происхождение» в NEST принимает только строку, результат elasticsearch не может проанализировать запрос. Как написать запрос в NEST, чтобы Elasticsearch мог его правильно разобрать?Как передать объект методу «Происхождение» в NEST (запрос FunctionScore)?

var originLoc = JsonConvert.SerializeObject(userLocation.GeoCenter); 
var searchDesc = new SearchDescriptor<MyCustomType>().Query(q => q.FunctionScore(fs => fs.Functions(func => func.Gauss("geoCenter", gs => gs.Origin(originLoc).Offset("1km").Scale("500m").Decay(0.99))))); 

НЕСТА передает код, указанный выше, чтобы elasticsearch, как это, который elasticsearch не может разобрать (происхождение обрабатывается как строка).

"query": { 
"function_score": { 
    "functions": [ 
    { 
     "gauss": { 
     "geoCenter": { 
      "origin": "{\"lat\":29.745703,\"lon\":-95.740514}", //<-- string 
      "scale": "500m", 
      "offset": "1km", 
      "decay": 0.99 
     } 
     } 
    } 
    ] 
} 

}

Ниже приведен корректный запрос, Elasticsearch может работать (происхождение обрабатывается как точка гео объекта)

"query": { 
"function_score": { 
    "functions": [ 
    { 
     "gauss": { 
     "geoCenter": { 
      "origin": { //<----- geo point serialized object 
      "lon": -95.740514, 
      "lat": 29.745703 
      }, 
      "scale": "500m", 
      "offset": "1km", 
      "decay": 0.99 
     } 
     } 
    } 
    ] 
} 

ответ

3

у меня есть что-то вроде этого в моем коде

.Query(f => f 
     .FunctionScore(fs => fs 
         .BoostMode(FunctionBoostMode.Sum) 
         .Functions(ff => ff 
          .Linear("location", d => d.Origin(origin).Scale("8km").Decay(0.33)) 
         ) 
     ) 
) 

Где происхождение ->var origin = object.latitude + "," + object.longitude;