Php эластичный поиск Сортировка по географическому расстоянию

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