2017-09-26 69 views
0

我使用弹性搜索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,但那也不会给我每个桶的结果样本,只是提供了区域。

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

谢谢!

+0

请问您的文档数远远超过400限制你提供?我想知道索引顺序是否与你的传播有关,因为据我可以告诉你没有根据距离进行评分,而只是一个未分类的过滤器。 – Miek

+0

是的,我有大约五十万个物体。我应该根据距离进行得分吗? – tkcast

+0

我在想你可以做那样的事情。也许执行范围在0-100之间的查询,然后是范围在101-200之间的另一个查询等,并将大小限制为符合您的近似分布目标的某些内容,可能映射多个结果集?我会担心使用这种方法误导分配。 – Miek

回答

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": {} 
     } 
     ] 
    } 
    } 
} 

+1

这是一个好主意!它解决了我的问题。非常感谢你! – tkcast

+0

很高兴:) – Miek