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

[2] http://blog.qbox.io/elasticsearch-aggregations

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 будет корректно кодироваться".

http://www.elasticsearch.org/guide/en/elasticsearch/client/php-api/current/_dealing_with_json_arrays_and_objects_in_php.html

В вашем случае вы должны использовать

$searchParams['body']['query']['filtered']['query']['match_all'] = new \stdClass();
Другие вопросы по тегам