弹性搜索 - 在地图上均匀分布

时间:2017-09-26 19:41:31

标签: google-maps elasticsearch

我使用弹性搜索2.我有一个大型的位置数据库,所有这些都有一个gps属性,即geopoint。 我的前端应用程序显示一个谷歌地图组件,其结果按我的查询过滤,让我们说pizza。问题是数据集增长了很多,客户端甚至想要在地图上得到结果。

因此,如果我在纽约搜索特定查询,我希望在纽约各地都有结果,但我目前只在曼哈顿的一个人口稠密地区收到400个结果。

我天真的做法是按距离过滤

{  
   "size":400,
   "query":{  
      "bool":{  
         "must":{  
            "match_all":{  

            }
         },
         "filter":{  
            "geo_distance":{  
               "distance":"200km",
               "gps":[  
                  -73.98502023369585,
                  40.76195656809083
               ]
            }
         }
      }
   }
}

这并不能保证结果会在地图上传播。 我该怎么办?

我已尝试将Geo-Distance Aggregation用于此

{  
   "size":400,
   "query":{  
      "bool":{  
         "must":{  
            "match_all":{  

            }
         },
         "filter":{  
            "geo_distance":{  
               "distance":"200km",
               "gps":[  
                  -73.98502023369585,
                  40.76195656809083
               ]
            }
         }
      }
   },
   "aggs":{  
      "per_ring":{  
         "geo_distance":{  
            "field":"gps",
            "unit":"km",
            "origin":[  
               -73.98502023369585,
               40.76195656809083
            ],
            "ranges":[  
               {  
                  "from":0,
                  "to":100
               },
               {  
                  "from":100,
                  "to":200
               }
            ]
         }
      }
   }
}

但我只收到一个结果列表+属于桶的元素数量。结果列表无法保证传播。

"aggregations": {
    "per_ring": {
        "buckets": [
            {
                "key": "*-100.0",
                "from": 0,
                "from_as_string": "0.0",
                "to": 100,
                "to_as_string": "100.0",
                "doc_count": 33821
            },
            {
                "key": "100.0-200.0",
                "from": 100,
                "from_as_string": "100.0",
                "to": 200,
                "to_as_string": "200.0",
                "doc_count": 6213
            }
        ]
    }
}

我想从一个桶中取出一半的结果,一半来自另一个桶。

我也试图使用Geohash Grid Aggregation,但这也没有给我每个桶的结果样本,只提供了区域。

那么如何通过一个弹性搜索查询在我的地图上得到间隔分布的结果?

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为引入一些随机性可能会给你想要的结果。我假设你因为索引排序而看到相同的分布(你没有根据距离进行评分,而你正在考虑前400,所以你最有可能看到相同的结果集)。

{
  "size": 400,
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "must": [
            {
              "match_all": {}
            }
          ],
          "filter": {
            "geo_distance": {
              "distance": "200km",
              "gps": [
                -73.98502023369585,
                40.76195656809083
              ]
            }
          }
        }
      },
      "functions": [
        {
          "random_score": {}
        }
      ]
    }
  }
}

Random score in elastic