忽略距离范围之外的结果

时间:2017-01-30 17:11:48

标签: elasticsearch

我正在使用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过滤掉每个范围类型超过指定距离的任何内容。

我一直在寻找一个没有太多运气的在线解决方案。

1 个答案:

答案 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