Повторно использовать / кэшировать поля скрипта для использования других частей запроса - PullRequest
0 голосов
/ 07 февраля 2019

Я работаю над проектом, в котором нам нужно показать расстояние, на которое списки находятся от местоположения пользователя.Чтобы показать расстояние, когда в качестве входных данных указывается широта / долгота, мы вычисляем расстояние, используя поле скрипта с именем «расстояние»

"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
                }
            }
        }
    }
}

1 Ответ

0 голосов
/ 10 февраля 2019

Вы рассчитываете расстояние, используя поле скрипта.Невозможно использовать поля сценариев для сортировки результата, поскольку поля сценариев вычисляются после сортировки документов, см. Здесь .

Что вы можете сделать, это использовать GeoДистанционная сортировка , для сортировки вашего результата:

GET /listings/_doc/_search
{
    "_source" : true,
    "query": {
        /* your query */ 
    },
    "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
                }
            }
        }
    },
    "sort" : [
        {
            "_geo_distance" : {
                "location" : {
                    "lat" : -33.8152,
                    "lon" : 151.0012
                },
                "order" : "asc",
                "unit" : "km",
                "mode" : "min",
                "distance_type" : "sloppy_arc"
            }
        }
    ]
}

Также см. этот вопрос , это может помочь.

...