Я работаю над проектом, в котором нам нужно показать расстояние, на которое списки находятся от местоположения пользователя.Чтобы показать расстояние, когда в качестве входных данных указывается широта / долгота, мы вычисляем расстояние, используя поле скрипта с именем «расстояние»
"script_fields" : {
"distance" : {
"script" : {
"lang": "painless",
"source": "Math.round((doc['location'].planeDistanceWithDefault(params.lat, params.lon, 0) * 0.001) * 100.0) / 100.0",
"params" : {
"lat" : -33.8152,
"lon" : 151.0012
}
}
}
}
Однако для поиска релевантности мы хотим ранжировать ближайший листинг выше имы снова вычисляем расстояние внутри запроса оценки функции.Это неэффективно.Я искал в Интернете, чтобы найти решение, но не повезло.
Есть ли способ повторно использовать поле сценария в других частях запроса или фильтра или сортировки?
Полный запрос:
GET /listings/_doc/_search
{
"_source" : true,
"query": {
"function_score": {
"score_mode": "sum",
"query": { "match": {
"source_id": 1
} },
"functions": [
{
"script_score": {
"script": {
"params": {
"dealer": {"a": 5, "b": 6},
"photo": {"a": 4, "b": 5},
"location": {"lat": -33.8152, "lon": 151.0012}
},
"source": "(doc['location'].planeDistanceWithDefault(params.location.lat, params.location.lon, 1000) * 0.001 < 25 ? 200000 : 0) + (doc['is_dealer'].value == 1 ? Math.pow(params.dealer.a, params.dealer.b) : 0) + (doc['hasPhoto'].value == 1 ? Math.pow(params.photo.a, params.photo.b) : 0)"
}
}
}
]
}
},
"script_fields" : {
"distance" : {
"script" : {
"lang": "painless",
"source": "Math.round((doc['location'].planeDistanceWithDefault(params.lat, params.lon, 0) * 0.001) * 100.0) / 100.0",
"params" : {
"lat" : -33.8152,
"lon" : 151.0012
}
}
}
}
}