我有一个具有坐标字段的POCO,并且使用NEST进行的映射和地理距离搜索均按预期工作。但是,我要使用NEST做的是还返回距GeoDistance查询中指定点的距离,作为搜索结果的一部分。到目前为止,我的研究表明有两种方法可以做到这一点:
我决定使用选项2,这是一些代码的样子:
public class User
{
public int ID { get; set; }
[GeoPoint]
public Coordinate Location { get; set; }
}
和查询本身:
var results = elasticClient.Search<User>(s => s
.Index("user")
.Query(q => q
.GeoDistance(gd => gd
.Field(f => f.Location)
.Distance(Distance.Miles(distance))
.Location(GeoLocation.TryCreate(data.Latitude, data.Longitude))
) && q
.Exists(e => e
.Field("location")
)
)
.ScriptFields(sf => sf
.ScriptField("distance", sf2 => sf2
.Inline(String.Format("doc['location'].arcDistance({0},{1})", data.Latitude, data.Longitude))
.Lang("painless")
)
)
);
虽然直接对elasticsearch运行此查询似乎很好,但是当我这样做时,我遇到了几个问题:
我的问题是:在NEST中访问脚本字段的推荐方法是什么?我是否必须完全放弃自动映射?或者,即使我不想特别对结果进行排序,我还是应该选择排序选项?
最佳答案
我最终通过以下方式接近了想要的目标:
[ElasticsearchType(Name = "User")]
属性添加到我的搜索结果子类通过结果中的
Hits
枚举时的((JArray)item.Fields["distance"]).Value<double>(0) / 1609.344
如果有人有更清洁的方法,请告诉我!
关于c# - 如何在Elasticsearch上使用NEST进行的查询中访问脚本字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45613363/