Elasticsearch расстановка приоритетов для географического расстояния для большого радиуса - PullRequest
0 голосов
/ 09 января 2020

У меня есть простой индексasticsearch 7.4, содержащий несколько заведений с привязанными к ним координатами геолокации. Как пользователь в моем приложении геолокации, я буду запрашивать все 50 близлежащих заведений, основываясь на моем текущем местоположении.

Проблема с этим подходом состоит в том, что когда пользователь уменьшает масштаб карты (очень большой радиус), он я буду получать только самые близкие заведения в крошечной части карты.

Я хотел бы получить другие результаты, разбросанные по всей карте, с помощью какой-либо расстановки приоритетов, например, более известных компаний и партнеров, которые требуют более высоких показателей. приоритет. Карты Google делают то же самое, но я не уверен, какой тип приоритетов здесь сделан.

Каков наилучший способ добиться этого с помощью 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"
         }
      }
   ]
}

1 Ответ

1 голос
/ 14 января 2020

Я сталкивался с подобным случаем в прошлом, у меня было 2 поля geo_coordinates и приоритет продукта, и мне пришлось сортировать продукты, используя оба этих поля, взяв некоторый настраиваемый вес каждого поля
С запросом на оценку функции Вы можете переопределить формулу внутренней оценки elasti c, вместо того, чтобы просто использовать сортировку по релевантности текста. Вы можете попросить elasti c также включить geo_distance в механизм оценки, есть функции diff, которые вы можете использовать для этого случая, которые я использовал * 1002. * и field_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, это логарифмическая c функция, поэтому вам нужно соответствующим образом настроить ее значение

[Отредактировано]
Чтобы получить одинаковую оценку для продукта на расстоянии 100 м и 10 км, необходимо определить область вокруг начала координат, которая может быть сделана с помощью offset https://www.elastic.co/guide/en/elasticsearch/reference/current/images/decay_2d.png
all продукты, у которых l ie в радиусе offset будут иметь одинаковый балл, а продукты, у которых l ie в радиусе scale+offset, будут иметь убывающий балл * 102 0 * https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html

...