首页 文章

弹性搜索 - 在 Map 上均匀分布

提问于
浏览
0

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

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

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

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

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

这并不能保证结果会在 Map 上传播 . 我该怎么做?

我尝试过使用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,但这也没有给我每个桶的结果样本,只提供了区域 .

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

谢谢!

1 回答

  • 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

相关问题