#php #laravel #elasticsearch
#php #laravel #elasticsearch
Вопрос:
Я пытаюсь отсортировать по расстоянию в км, мой тип поля "location": { "properties": { "lat": { "type": "float" }, "lon": { "type": "float" } } },
в моем индексе его хранилище выглядит так "location": { "lon": 72.9814762, "lat": 33.7013063 },
и в запросе
Комментарии:
1. Вероятно, вам следует сопоставить свое местоположение с типом данных с географической точкой . Я не уверен, что это может быть автоматически отображено, хотя вам может потребоваться вручную определить сопоставления.
Ответ №1:
@apokryfos прав, вы должны сопоставить данные как географическую точку. После этого вы сможете выполнить сортировку по _geo_distance
"sort": [
{
"_geo_distance": {
"coords": {
"lat": -27.87,
"lon": -54.43
},
"order": "asc",
"unit": "km",
"mode": "min",
"distance_type": "arc",
"ignore_unmapped": true
}
}
]
Ответ №2:
Вы должны выполнить сопоставление вручную. Пожалуйста, найдите пример отображения ниже (работает на ES 7.4.0). Первая команда создает индекс, вторая команда отображает 2 поля (одно поле типа geo_point), а третья команда извлекает информацию о сопоставлении.
> curl -X PUT -H "Content-Type:application/json"
> "http://localhost:9200/my_helloworld_location"
>
> curl -X PUT -H "Content-Type:application/json"
> "http://localhost:9200/my_helloworld_location/_mapping/doc?include_type_name=true"
> -d ' { "properties":{ "locationName":{
> "type":"text",
> "fields":{
> "keyword":{
> "ignore_above":20,
> "type":"keyword"
> } } }, "location":{
> "type":"geo_point",
> "fields":{
> "keyword":{
> "ignore_above":20,
> "type":"keyword"
> } } } } }'
>
> curl -X GET -H "Content-Type:application/json"
> "http://localhost:9200/my_helloworld_location/_mapping?pretty=true"