我正在使用ElasticSearch处理一个处理"帖子"的应用程序。我目前正在使用geo_point
,因此它将返回按最终用户距离排序的所有帖子。虽然这是有效的,但我还需要在系统的另一个方面工作。
如果我要支付我的帖子并选择" Local"作为区域范围,此帖子应仅显示给小于或等于20英里的最终用户。
我的索引上有一个名为spotlight_range的列,如果spotlight_range =' Local'有一种方法我可以创建一个查询来忽略所有记录。并且距离> 20英里?我需要为几个不同的聚光灯范围做这个。例如,区域可能是100英里或更少,等等。
我当前的查询看起来像这样
$params = [
'index' => 'my_index',
'type' => 'posts',
'size' => 25,
'from' => 0,
'body' => [
'sort' => [
'_geo_distance' => [
'post_location' => [
'lat' => '44.4759',
'lon' => '-73.2121'
],
'order' => 'asc',
'unit' => 'mi'
]
],
'query' => [
'filtered' => [
'query' => [
'match_all' => []
],
'filter' => [
'geo_distance' => [
'distance' => '100mi',
'post_location' => [
'lat' => '44.4759',
'lon' => '-73.2121'
]
]
]
]
]
]
];
我的索引设置了以下字段。
'id' => ['type' => 'integer'],
'title' => ['type' => 'string'],
'description' => ['type' => 'string'],
'price' => ['type' => 'integer'],
'shippable' => ['type' => 'boolean'],
'username' => ['type' => 'string'],
'post_location' => ['type' => 'geo_point'],
'post_location_string' => ['type' => 'string'],
'is_spotlight' => ['type' => 'boolean'],
'spotlight_range' => ['type' => 'string'],
'created_at' => ['type' => 'date', 'format' => 'yyyy-MM-dd HH:mm:ss'],
'updated_at' => ['type' => 'date', 'format' => 'yyyy-MM-dd HH:mm:ss']
我的最终目标并非专门用于搜索距离< X和范围= Y,而是根据我指定的距离将它过滤掉所有类型。搜索应返回所有类型的范围,但也会根据传入查询的用户lat / lon过滤掉每个范围类型超过指定距离的任何内容。
我一直在寻找一个没有太多运气的在线解决方案。
答案 0 :(得分:0)
我会在文档中添加一个圈Glide.with(context).load(new DBImageUri(/*your unique id string for database image*/)).into(imageview);
,以geo_shape
为中心,半径对应post_location
,因为您在索引时知道这两个信息。这样你就可以在每个帖子中编码其相应的"到达"。
spotlight_range
所以"本地"一旦索引
,文档看起来就像这样...
'post_location' => ['type' => 'geo_point'],
'spotlight_range' => ['type' => 'string'],
'reach' => ['type' => 'geo_shape'], <---- add this
然后,查询将以用户所在半径为中心的另一个{
"spotlight_range": "local",
"post_location": {
"lat": 42.1526,
"lon": -71.7378
},
"reach" : {
"type" : "circle",
"coordinates" : [-71.7378, 42.1526],
"radius" : "20mi"
}
}
为特色,并且只会检索geo_shape
与查询中的圆形相交的文档。
reach