gpt4 book ai didi

elasticsearch - 大半径的Elasticsearch地理距离查询优先级

转载 作者:行者123 更新时间:2023-12-03 01:22:21 31 4
gpt4 key购买 nike

我有一个简单的elasticsearch 7.4索引,其中包含多个场所,并为其分配了地理位置坐标。作为我的地理位置应用程序中的用户,我将根据当前位置请求附近的所有50个场所。

这种方法的问题是,当用户缩小 map 时(非常大的半径),它将仅在 map 的一小部分中仅接收最近的场所。

我想通过某种优先次序来检索散布在整个 map 上的其他结果,例如要求更高优先级的更知名的公司和合作伙伴。谷歌 map 做类似的事情,但是我不确定在那里进行了哪种优先排序。

使用ES实现此目标的最佳方法是什么?

我当前的查询有点像这样:

GET /places/_search
{
"size": 50,
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "10km",
"coordinates": {
"lat": -2.000000,
"lon": -4.000000
}
}
}
}
},
"sort": [
{
"_geo_distance": {
"coordinates": {
"lat": -2.000000,
"lon": -4.000000
},
"order": "asc",
"unit": "m",
"distance_type": "arc"
}
}
]
}

最佳答案

过去我遇到过类似的情况,我有2个字段geo_coordinates和一个产品的优先级,我必须通过对每个字段进行一些可配置的权重来使用这两个字段对产品进行排序使用函数得分查询,您可以重新定义 flex 内部对象评分公式,而不是仅使用文本相关性排序,您可以要求Elastic在评分机制中也包含geo_distance,在这种情况下,您可以使用diff函数我使用了linearfield_value_factor https://www.elastic.co/guide/en/elasticsearch/reference/5.6/query-dsl-function-score-query.html

POST geotest/_search
{
"query": {
"bool": {
"must": [
{
"match_all": {}
},
{
"function_score": {
"min_score": 0.1,
"functions": [
{
"weight": 1,//weight of coordinates
"linear": {
"coor": {
"offset": "500m",
"origin": [
106.82,
-6.22425
],
"scale": "500m"
}
}
},
{
"field_value_factor": {
"factor": 1,//weight of priority
"field": "priority",
"modifier": "log2p"
}
}
]
}
}
]
}
}
}

只需注意field_value_factor中的因子,它是一个对数函数,因此您需要相应地调整其值

[编辑]
要在100m和10km的距离上获得相同的产品分数,您必须在原点周围定义一个区域,可以通过 offset https://www.elastic.co/guide/en/elasticsearch/reference/current/images/decay_2d.png来完成
位于 offset半径内的所有产品将具有相同的分数,位于 scale+offset半径内的产品将具有降低的分数
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html

关于elasticsearch - 大半径的Elasticsearch地理距离查询优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59670737/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com