当前位置: 首页 > 知识库问答 >
问题:

按嵌套的地理距离属性排序

慕宜民
2023-03-14

我正在尝试按地理距离对具有嵌套地理点映射的索引进行排序。

这是我的简化映射:

'organizations' => [
                '_doc' => [
                    'properties' => [
                        'locations' => [
                            'type' => 'nested',
                            'properties' => [
                                'point' => [
                                    'type' => 'geo_point',
                                    'ignore_malformed' => true
                                ]
                            ]
                        ]
                    ]
                ]
            ]

这里,每个组织可以有几个地点点。

文档:

PUT /organizations , 
[
        {
            name: "A",
            locations: [
                {
                    point: {
                        lat: 1.5,
                        lon: 2
                    }
                },
                {
                    point: {
                        lat: 1,
                        lon: 0
                    }
                }
            ]
        },
        {
            name: "B",
            locations: [
                {
                    point: {
                        lat: 4.2,
                        lon: 3
                    }
                }
            ]
        },
        {
            name: "C",
            locations: [
                {
                    point: {
                        lat: 0.4,
                        lon: 1
                    }
                }
            ]
        }
    ];

这是我的查询(PHP数组):

[
  "query" =>  [
    "query_string" => [
      "query" => "*"
    ]
  ]
  "sort" =>  [
    0 =>  [
      "_geo_distance" => [
        "locations.point" => "1, 0.1"
        "order" => "asc"
        "unit" => "km"
        "nested_path" => "locations"
      ]
    ]
  ]
]

预期结果 :

1 => name : A
2 => name : C
3 => bame : B

我希望按geo_point排序资源(检查每个位置,然后检查某个位置是否靠近给定的纬度/经度)

共有1个答案

司寇照
2023-03-14

您可以使用< code>function_score来实现您的目标。

例如,使用查询,例如:

注意:代码在< code>js中;

"_geo_distance": {
  "place.location.geo.coordinates": [
    this._geo.lon,
    this._geo.lat
   ],
  "order": "asc",
  "unit": "km",
  "distance_type": "plane"
}

然后在<code>函数_score

function_score["script_score"] = {
"script": {
        "source": `1000/doc['place.location.geo.coordinates'].planeDistance(${this._geo.lat},${this._geo.lon}) `
}

原始function_score如下:

'function_score': {
  "score_mode": "multiply",
  'query': {
    "dis_max": {
       "tie_breaker": 0.7,
       "boost": 1.9,
       "queries": this._query
    },
  },
  'boost': 0.06,
  'boost_mode': 'sum',
 }
 类似资料:
  • 问题内容: 我在elasticsearch中的索引具有以下映射: 源文档如下: 我正在尝试使用距离脚本来基于地理点计算距离。我在elasticsearch结果中发现了该帖子的Return distance吗?帮我 我正在尝试获取所有结果,按半径1km进行过滤,获取距离,然后对geo_point进行排序。查询的结构如下: 我收到状态为500的以下错误: 我尝试以这种方式重写查询: 然后我得到这个错误

  • 我有一个使用Spring Boot 1.5.1和Spring Data Rest的数据库服务。我将我的实体存储在MySQL数据库中,并使用Spring的PagingAndSorting Repository通过REST访问它们。我发现这表明支持按嵌套参数排序,但我找不到按嵌套字段排序的方法。 我有以下课程: 例如,当使用该方法时: 并调用 URI http://localhost:8080/peo

  • 问题内容: 我有以下模型: 我应如何查询以距离排序(距离为无穷大)? 如果需要,可以在PosgreSQL,GeoDjango上工作。 问题答案: 首先,最好使一个点字段而不是使lat和lnt分开: 然后,你可以像这样过滤它:

  • 我正在实现一个程序,能够接收10个最近的对象。作为数据库,我使用弹性搜索,我的模型看起来像这样。 我创建了一个这样的索引 我会插入像这样的新文档 该模型的所有值都已设置,并且可以正常工作。 但是现在我想得到10公里范围内最近的10个。我这样质疑这个 但是它不返回任何文档,但是如果我将距离值设置为10000km,它将返回文档。 我在模型中使用的数据是:LAT:47.4595248 LON:9.638

  • 所以我这里有个问题。。。 我正在使用ruby gem与Elasticsearch进行通信 我经过的是这个... 但我收到了这个错误。。。 简单地说。。。 术语桶只能在子聚合器路径上排序,该子聚合器路径由路径中的零个或多个单桶聚合和路径端的最终单桶或指标聚合构建。 有什么想法吗?

  • 我使用带有嵌套属性的Vaadin网格,例如。我想用对这些列进行排序,因为是一个LocalDateTime,它总是。但这行不通。我需要为每个这样的列定义一个,我已经使用了很多:-) 这是一个bug还是故意的? 亲切地问候 张秀坤