Elasticsearch для поиска мест на некотором расстоянии от набора контрольных точек - PullRequest
1 голос
/ 03 мая 2020

Мне нужна помощь, чтобы составить запрос, чтобы определить, какие места находятся на расстоянии менее 1000 метров от некоторых контрольных точек, используя эластичный поиск. IE: Какие аптеки находятся на расстоянии менее 1000 метров от определенного пользователем набора станций метро. У меня есть значения широты и долготы.

Я нашел несколько примеров этого типа поиска наasticsearch, но все они рассматривают набор c набора контрольных точек на фильтрах (жестко закодированный лат и lng).

Добавление дополнительной информации:

GET /places
{
  "places" : {
    "aliases" : { },
    "mappings" : {
      "properties" : {
        "location" : {
          "type" : "geo_point"
        },
        "name" : {
          "type" : "text"
        }
      }
    }
}

GET /references
{
"references" : {
    "aliases" : { },
    "mappings" : {
      "properties" : {
        "location" : {
          "type" : "geo_point"
        },
        "name" : {
          "type" : "text"
        }
      }
    }
}

Я пытаюсь создать поисковый запрос, в котором я могу выбрать документы по индексу мест на основе списка документов по индексу ссылок. В большинстве примеров просто показано, как искать документы следующим образом:

GET /places/_search
{
    "query": {
        "bool" : {
            "must" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_distance" : {
                    "distance" : "1000m",
                    "pin.location" : {
                        "lat" : 40,
                        "lon" : -70
                    }
                }
            }
        }
    }
}

Значение pin.location / origin в приведенном выше примере является фиксированным, но мне нужно это на основе ссылочного индекса.

In MySQL должно быть так:

select pl.latitude, pl.longitude from places as pl
where exists (
select rf.id from references as rf where ST_Distance_Sphere(
        point(pl.longitude, pl.latitude),
        point(rf.longitude, rf.latitude)
    ) < 1000 and rf.name = "subway"
) and pl.name = "drugstore"

1 Ответ

0 голосов
/ 03 мая 2020

AFAIK &, к сожалению, в ES нет альтернативы ST_Distance_Sphere.

Вам нужно будет переосмыслить способ структурирования ваших данных - может быть, ближайшие n заведения каждого place? Скажем, 5 км. Затем, если пользователю требуется <= 1 км, вы можете отфильтровать слишком отдаленные. </p>

Станции метро / аптеки / et c в основном являются фиксированными точками (как в прямом, так и в переносном смысле). Они не меняют свойства / geoloc / et c так часто. Когда они делают, простые обновления каждого соседнего места должны делать свое дело.

...