2016-03-04 2 views
2

я создал и индекс так же, как например, учебники, здесь ...Geo запрос с использованием elasticsearch

https://www.elastic.co/guide/en/elasticsearch/reference/2.0/geo-point.html

в конкретных писать следующее:

curl -PUT 'localhost:9200/my_index?pretty' -d ' 
{ 
    "mappings": { 
    "my_type": { 
     "properties": { 
     "location": { 
      "type": "geo_point" 
     } 
     } 
    } 
    } 
}' 

Я также добавил две точки в качестве данных

curl -PUT 'localhost:9200/my_index/my_type/1?pretty' -d' 
{ 
    "text": "first geo-point", 
    "location": { 
    "lat": 41.12, 
    "lon": -71.34 
    } 
}' 

curl -PUT 'localhost:9200/my_index/my_type/1?pretty' -d' 
{ 
    "text": "second geo-point", 
    "location": { 
    "lat": 41.13, 
    "lon": -71.35 
    } 
}' 

Пример запроса геоинформационной рамки на t он работает страница (то есть):

curl -XGET 'localhost:9200/my_index/_search?pretty' -d' 
{ 
    "query": { 
    "geo_bounding_box": { 
     "location": { 
     "top_left": { 
      "lat": 42, 
      "lon": -72 
     }, 
     "bottom_right": { 
      "lat": 40, 
      "lon": -74 
     } 
     } 
    } 
    } 
}' 

Но пример с этой страницы (https://www.elastic.co/guide/en/elasticsearch/reference/2.0/query-dsl-geo-bounding-box-query.html) не работает:

То, что я пытался выглядеть следующим образом:

curl -XGET 'localhost:9200/my_index/_search?pretty' -d' 
{ 
    "bool" : { 
     "must" : { 
      "match_all" : {} 
     }, 
     "filter" : { 
      "geo_bounding_box" : { 
       "my_type.location" : { 
        "top_left" : { 
         "lat" : 42, 
         "lon" : -72 
        }, 
        "bottom_right" : { 
         "lat" : 40, 
         "lon" : -74 
        } 
       } 
      } 
     } 
    } 
}' 

Ошибка Я получаю следующее:

"error" : { 
    "root_cause" : [ { 
     "type" : "search_parse_exception", 
     "reason" : "failed to parse search source. unknown search element [bool]", 
     "line" : 3, 
     "col" : 5 
    } ], 
    "type" : "search_phase_execution_exception", 
    "reason" : "all shards failed", 
    "phase" : "query", 
    "grouped" : true, 
    "failed_shards" : [ { 
     "shard" : 0, 
     "index" : "my_index", 
     "node" : "0qfvkynhTRyjHFRurBLJeQ", 
     "reason" : { 
     "type" : "search_parse_exception", 
     "reason" : "failed to parse search source. unknown search element [bool]", 
     "line" : 3, 
     "col" : 5 
     } 
    } ] 
    }, 
    "status" : 400 
} 

Надеюсь, что это просто ошибка, Что я делаю неправильно?

ответ

5

Вы должны указать, что все это является запрос:

curl -XGET 'localhost:9200/my_index/_search?pretty' -d' 
{ 
    "query": { 
     "bool" : { 
      "must" : { 
       "match_all" : {} 
      }, 
      "filter" : { 
       "geo_bounding_box" : { 
        "my_type.location" : { 
         "top_left" : { 
          "lat" : 42, 
          "lon" : -72 
         }, 
         "bottom_right" : { 
          "lat" : 40, 
          "lon" : -74 
         } 
        } 
       } 
      } 
     } 
    } 
}' 

Однако, насколько я понимаю, используя логическое значение с суслом и фильтром старым способом делать вещи. В предыдущих версиях гео-запросы считались «фильтрами», поэтому вам нужно было сначала запустить запрос match_all, чтобы вернуть все результаты, а затем отфильтровать с помощью ограничивающего рамки. В Elasticssearch 2.0+ нет разделения между фильтрами и запросами - все это запрос. Таким образом, вы можете напрямую выполнить гео-запрос:

curl -XGET 'localhost:9200/my_index/_search?pretty' -d' 
{ 
    "query": { 
    "geo_bounding_box": { 
     "location": { 
     "top_left": { 
      "lat": 42, 
      "lon": -72 
     }, 
     "bottom_right": { 
      "lat": 40, 
      "lon": -74 
     } 
     } 
    } 
    } 
}' 
+0

Спасибо! Это сработало! –

Смежные вопросы