Elasticsearch найти документы по местоположению
Я проиндексировал ряд документов в моей базе данных Elasticsearch, и когда я запрашиваю их все, я вижу, что они имеют такую структуру:
GET http://localhost:9200/restaurants/restaurant/_search
Выход:
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 362,
"max_score": 1,
"hits": [
{
"_index": "restaurants",
"_type": "restaurant",
"_id": "2",
"_score": 1,
"_source": {
"businessName": "VeeTooNdoor Dine",
"geoDescription": "Right next to you2",
"tags": {},
"location": {
"lat": -33.8917007446,
"lon": 151.1369934082
}
}
},
...
]
}
}
Теперь я хочу найти рестораны вокруг заданного географического местоположения и, следуя документации [1], я использую что-то вроде этого:
{
"filtered" : {
"query" : {
"match_all" : {}
},
"filter" : {
"geo_distance" : {
"distance" : "1km",
"location" : {
"lat": -33.8917007446,
"lon": 151.1369934082
}
}
}
}
}
То, что я изменил, это match_all
поскольку я не хочу указывать какое-либо конкретное поле поиска, меня интересует только географическое местоположение.
Когда я запускаю запрос, я получаю следующее сообщение:
"error": "SearchPhaseExecutionException[Failed to execute phase [query], all shards failed; shardFailures {[olAoWBSJSF2XfTnzEhKIYA][btq][3]: SearchParseException[[btq][3]: from[-1],size[-1]: Parse Failure [Failed to parse source [{\n \"filtered\" : {\n \"query\" : {\n \"match_all\" : {}\n },\n \"filter\" : {\n .....
Теперь я заметил следующее на странице учебника:
Обновление: автоматическое сопоставление свойств "geo enabled" было отключено с момента публикации этой статьи. Вы должны предоставить правильное отображение для гео-свойств. Пожалуйста, смотрите документацию.
Что создает у меня впечатление, что я должен создать "отображение", которое определяет типы полей. Однако в документе, на который он ссылается, не дается достаточно информации о том, как на самом деле это сделать. Он показывает BLOB-объекты JSON, но я не уверен в правильности URL для этого.
Более того, я использую PHP-клиент и не уверен, поддерживает ли он даже отображения, как показано в этом обзоре [2].
У меня почему-то складывается впечатление, что в запрос DSL и т. Д. Было внесено довольно много изменений, и что многие примеры в Интернете больше не работают, я могу ошибаться. Я использую Elasticsearch 1.0.0.
[1] http://www.elasticsearch.org/blog/geo-location-and-search
4 ответа
Удаление запроса - это то, что наконец-то сработало для меня:
{
"filter": {
"geo_distance" : {
"distance" : "300km",
"location" : {
"lat" : 45,
"lon" : -122
}
}
}
}
Что может быть не так:
1: ваш запрос показывает pin.location
и ваше поле просто location
,
2: ваш _mapping
за location
может быть не так
Ваше отображение показывает что-то вроде:
"location": {
"type": "geo_point",
"geohash_precision": 4
}
Я смог запустить этот поиск по некоторым из моих собственных данных:
POST /myindex/mydata/_search
{
"query": {
"match_all": {}
},
"filter": {
"geo_distance" : {
"distance" : "100km",
"_latlng_geo" : {
"lat": -33.8917007446,
"lon": 151.1369934082
}
}
}
}
... фрагмент моего отображения:
"properties": { .....
"_latlng_geo": {
"type": "geo_point",
"geohash_precision": 4
}
.....
РЕДАКТИРОВАТЬ: Как использовать Put Mapping API
Вы можете создать отображение при создании индекса следующим образом:
PUT /twitter/
{
"settings" : {
"number_of_shards" : 1
},
"mappings" : {
"tweet":{
"properties":{
"latlng" : {
"type" : "geo_point"
}
}
}
}
}
Вы должны заменить "location" на "restaurant.location", потому что ElasticSearch интерпретирует его как тип, не похожий на атрибут.
{
"filtered" : {
"query" : {
"match_all" : {}
},
"filter" : {
"geo_distance" : {
"distance" : "1km",
"restaurant.location" : {
"lat": -33.8917007446,
"lon": 151.1369934082
}
}
}
}
Я надеюсь, что это поможет вам.
Как указано в документах:
"Мы используем универсальный объект PHP stdClass для представления пустого объекта. Теперь JSON будет корректно кодироваться".
В вашем случае вы должны использовать
$searchParams['body']['query']['filtered']['query']['match_all'] = new \stdClass();