我使用弹性搜索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 :(得分: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": {}
}
]
}
}
}