我在elasticsearch中有一个索引,它包含一个Id字段和一个地址点。
现在为了得到最近的文档,我必须进行两次查询,一次是通过id获取原始文档,然后使用其坐标进行geosort。我想知道是否还有作为单个查询执行此操作。
public IEnumerable<RestaurantSearchItem> GetNearbyRestaurants(double latitude, double longitude)
{
var query = _elasticClient.Search<RestaurantSearchItem>(s =>
s.Index(RestaurantSearchItem.IndexName)
.Sort(
ss =>ss.GeoDistance(
g => g
.Field(p => p.Location)
.DistanceType(GeoDistanceType.Plane)
.Unit(DistanceUnit.Meters)
.Order(SortOrder.Ascending)
.Points(new GeoLocation(latitude,longitude)))));
var nearByRestaurants = query.Documents;
foreach (var restaurant in nearByRestaurants)
{
restaurant.Distance = Convert.ToDouble(query.Hits.Single(x => x.Id == restaurant.Id).Sorts.Single());
}
return nearByRestaurants;
}
答案 0 :(得分:0)
我认为在一个查询中不可能这样做;用于排序的纬度和经度不能从数据的其他地方查找,因此需要在请求中提供。
答案 1 :(得分:0)
据我所知,接受文档id作为参数的唯一Elasticsearch查询是terms query,它从给定文档中提取查询的术语列表。
但您希望根据位置找到相关文档,而不是确切的条款。 这可以通过denormalization of your data来实现。它可能看起来像是在nested字段中存储附近餐馆的列表。
在非规范化的情况下,您必须在将文档插入索引之前预先计算所有附近的餐馆。