单个查询返回基于一个文档Id而不是其geopoint按距离排序的文档

时间:2018-03-27 15:10:56

标签: elasticsearch nest

我在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;
        } 

2 个答案:

答案 0 :(得分:0)

我认为在一个查询中不可能这样做;用于排序的纬度和经度不能从数据的其他地方查找,因此需要在请求中提供。

答案 1 :(得分:0)

据我所知,接受文档id作为参数的唯一Elasticsearch查询是terms query,它从给定文档中提取查询的术语列表。

但您希望根据位置找到相关文档,而不是确切的条款。 这可以通过denormalization of your data来实现。它可能看起来像是在nested字段中存储附近餐馆的列表。

在非规范化的情况下,您必须在将文档插入索引之前预先计算所有附近的餐馆。