Как прочитать расстояние от ответа Elasticsearch - PullRequest
0 голосов
/ 03 июля 2018

Я использую Elasticsearch V6 , NEST V6 .

Я ищу ES, как показано ниже, и использую ScriptFields, чтобы вычислить расстояние и включить его в результат.

var searchResponse = _elasticClient.Search<MyDocument>(new SearchRequest<MyDocument>
{
    Query = new BoolQuery
    {
        Must = new QueryContainer[] { matchQuery },
        Filter = new QueryContainer[] { filterQuery },
    },
    Source = new SourceFilter
    {
        Includes = resultFields    // fields to be included in the result
    },
    ScriptFields = new ScriptField
    {
        Script = new InlineScript("doc['geoLocation'].planeDistance(params.lat, params.lng) * 0.001")   // divide by 1000 to convert to km
        {
            Lang = "painless",
            Params = new FluentDictionary<string, object>
            {
                { "lat", _center.Latitude },
                { "lng", _center.Longitude }
            }
        }
    }
});

Теперь я пытаюсь прочитать результат поиска, и я не уверен, как прочитать расстояние от ответа, вот что я пытался:

// this is how I read the Document, all OK here
var docs = searchResponse.Documents.ToList<MyDocument>();

// this is my attempt to read the distance from the result
var hits = searchResponse.Hits;
foreach (var h in hits)
{
    var d = h.Fields["distance"];
    // d is of type Nest.LazyDocument 
    // I am not sure how to get the distance value from object of type LazyDocument
}                                  

Во время отладки я вижу значение расстояния, я просто не знаю, как его прочитать?

enter image description here

1 Ответ

0 голосов
/ 04 июля 2018

Я нашел ответ здесь

Чтобы прочитать поисковый документ и расстояние:

foreach (var hit in searchResponse.Hits)
{
    MyDocument doc = hit.Source;    
    double distance = hit.Fields.Value<double>("distance");  
}

А если вас интересует только расстояние:

foreach (var fieldValues in searchResponse.Fields)
{
    var distance = fieldValues.Value<double>("distance");
}
...