在 ONGR ElasticsearchDSL 中按距离对结果进行排序

Posted

技术标签:

【中文标题】在 ONGR ElasticsearchDSL 中按距离对结果进行排序【英文标题】:Sorting results by distance in ONGR ElasticsearchDSL 【发布时间】:2019-02-05 07:26:20 【问题描述】:

我正在使用 ONGR ElasticsearchDSL Bundle 和 Symfony 3 来按纬度/经度坐标搜索城市列表,如下所示:

$repository = $this->elasticsearchManager->getRepository(CityDocument::class);
$search = $repository->createSearch();

$boolQuery = new BoolQuery();
$boolQuery->add(new MatchAllQuery());
$geoQuery = new GeoDistanceQuery('geo', '50km', $theSearch['location']);
$boolQuery->add($geoQuery, BoolQuery::FILTER);
$search->addQuery($boolQuery);
$documents = $repository->findDocuments($search);

虽然这给了我匹配城市的良好结果,但我不清楚如何按与我的源点的距离(在 $theSearch['location'] 中找到)对它们进行排序,以便我让它们从最近到最远排序?!

【问题讨论】:

【参考方案1】:

这是使用 ElasticsearchDSL 的正确方法,包括您需要的排序。

$repository = $this->elasticsearchManager->getRepository(CityDocument::class);
$search = $repository->createSearch();

$geoQuery = new GeoDistanceQuery('geo', '50km', $theSearch['location']);
$search->addQuery($geoQuery, BoolQuery::FILTER);

$sort = new FieldSort('_geo_distance', null, [
    'geo' => $geoLocation,
    'order' => 'asc',
    'unit' => 'km',
    'mode' => 'min',
    'distance_type' => 'arc'
]);
$search->addSort($sort);

$documents = $repository->findDocuments($search);

【讨论】:

当我按原样使用您的代码时,我得到一个“未找到 [location] 的映射以便排序”。但这是意料之中的,因为我的位置字段实际上被称为“地理”,而不是“位置”。但是如果我切换它,我会得到一个“如果不使用特定的排序功能,比如 geo_distance,就无法对 geo_point 字段进行排序”。那么显然 FieldSort 需要一些额外的参数?但我真的不知道是哪个。 是的,geo_distance 是完全不同的排序。如此处所述:elastic.co/guide/en/elasticsearch/reference/current/… 您需要将所有参数传递给FieldSort 您仍然可以将FieldSort('_geo_distance', null, ['all params array'])_geo_distance 字段一起使用,并且您需要在第三个变量中传递所有参数。 酷,@saimaz,你把我推向了正确的方向。我编辑了您的答案,使其适合我的问题,现在将其设置为正确答案。感谢您的帮助!

以上是关于在 ONGR ElasticsearchDSL 中按距离对结果进行排序的主要内容,如果未能解决你的问题,请参考以下文章

将 SQL 查询转换为 Elasticsearch dsl 以进行数据可视化

关于 Elasticsearch json dsl 查询结构的困惑

Elasticsearch:使用 JDBC client 连接到 Elasticsearch

我给 ”Go 语言“ 开发了 6 个在线工具

在 Maven 中,如何在版本中命名战争文件与在快照构建中不同

存储在 plist 中的数据在模拟器中有效,但在设备中无效