2016-07-31 1 views
0

Я сохранил несколько документов в Elasticsearch, каждый из которых содержит массив координат, чтобы нарисовать линию на Картах Google. В этих документах я хочу выполнить запрос Geo Bounding Box Query, чтобы узнать, какие из них имеют отношение к тому, где пользователь смотрит на карту. Когда я пытаюсь это сделать, я получаю сообщение об ошибке «Не удалось получить xcontent».Elasticsearch geo_bounding_box не удалось получить xcontent

Это пример того, как один из документов выглядеть (может содержать сотни координат):

{ 
    "type" : "Feature", 
    "properties" : { 
     "Type" : "Path", 
     "Name" : "An example line" 
    }, 
    "geometry" : { 
     "type" : "LineString", 
     "coordinates" : [ [ 14.998659698781326, 59.83282967919488 ], [ 14.998221382378132, 59.832346163020866 ], [ 14.997889000000002, 59.100000001 ], [ 14.997201215918253, 59.83165390720879 ], [ 14.996313, 59.83200200000001 ] ] 
    } 
} 

Это запрос, я бег с помощью завитка (благоустроена для удобства чтения, в противном случае в одной строке без пробелов):

curl.exe http://11.11.111.111:9200/map/path/_search?pretty -d' 
{ 
    "query": { 
     "geo_bounding_box": { 
      "location": { 
       "top_left": { 
        "lat": 60.50, 
        "lon": 14.30 
       }, 
       "bottom_right": { 
        "lat": 59.86, 
        "lon": 16.06 
       } 
      } 
     } 
    } 
}' 

Это respone из приведенного выше запроса:

{ 
    "error" : { 
    "root_cause" : [ { 
     "type" : "parse_exception", 
     "reason" : "Failed to derive xcontent" 
    } ], 
    "type" : "search_phase_execution_exception", 
    "reason" : "all shards failed", 
    "phase" : "query", 
    "grouped" : true, 
    "failed_shards" : [ { 
     "shard" : 0, 
     "index" : "map", 
     "node" : "ye2EayFlRFCM6xGWjzcfwQ", 
     "reason" : { 
     "type" : "parse_exception", 
     "reason" : "Failed to derive xcontent" 
     } 
    } ] 
    }, 
    "status" : 400 
} 

И это журнал нашел в Elasticsearch:

[2016-07-31 10:23:10,268][DEBUG][action.search   ] [one] [map][2], node[ye2EayFlRFCM6xGWjzcfwQ], [P], v[2], s[STARTED], a[id=Ptvmzu-2R6WHH89BLifz6g]: Failed to execute [[email protected]] lastShard [true] 
RemoteTransportException[[one][10.3.0.4:9300][indices:data/read/search[phase/query]]]; nested: SearchParseException[failed to parse search source [_na_]]; nested: ElasticsearchParseException[Failed to derive xcontent]; 
Caused by: SearchParseException[failed to parse search source [_na_]]; nested: ElasticsearchParseException[Failed to derive xcontent]; 
     at org.elasticsearch.search.SearchService.parseSource(SearchService.java:855) 
     at org.elasticsearch.search.SearchService.createContext(SearchService.java:654) 
     at org.elasticsearch.search.SearchService.createAndPutContext(SearchService.java:620) 
     at org.elasticsearch.search.SearchService.executeQueryPhase(SearchService.java:371) 
     at org.elasticsearch.search.action.SearchServiceTransportAction$SearchQueryTransportHandler.messageReceived(SearchServiceTransportAction.java:368) 
     at org.elasticsearch.search.action.SearchServiceTransportAction$SearchQueryTransportHandler.messageReceived(SearchServiceTransportAction.java:365) 
     at org.elasticsearch.transport.TransportRequestHandler.messageReceived(TransportRequestHandler.java:33) 
     at org.elasticsearch.transport.RequestHandlerRegistry.processMessageReceived(RequestHandlerRegistry.java:75) 
     at org.elasticsearch.transport.TransportService$4.doRun(TransportService.java:376) 
     at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at java.lang.Thread.run(Thread.java:745) 
Caused by: ElasticsearchParseException[Failed to derive xcontent] 
     at org.elasticsearch.common.xcontent.XContentFactory.xContent(XContentFactory.java:240) 
     at org.elasticsearch.search.SearchService.parseSource(SearchService.java:824) 

Сам JSON проверяет как correct.Other запросы работают правильно, я могу получить конкретный один за ID и получить все, как хорошо. Только этот запрос дает мне некоторые проблемы.

Я пробовал запрос с использованием фильтров, как на странице documentations, но это тоже не сработало, указав ту же ошибку, что и указанная выше. Я использую Elasticsearch 2.3.1 для Linux.

Что необходимо для выполнения этого запроса? Что означает ошибка «Не удалось получить xcontent» в данном случае и как я могу ее решить?

+0

Не относится к проблеме, с которой вы столкнулись, но 'geo_bounding_box' работает только с точками геометрии, а не с гео-фигурами. – pickypg

+0

В документации говорится: «Фильтр может работать с несколькими местоположениями/точками на документ. После того, как одно место/точка совпадает с фильтром, документ будет включен в фильтр». Линейная линия - это, по сути, куча точек, через которые рисуется линия, или я неправильно интерпретирую? – Motsols

+0

Я считаю, что вы неверно истолковываете. Вы можете иметь массив точек, который отличается от строки. – pickypg

ответ

0

Если у кого-то еще такая же проблема, вот решение, которое я нашел. В запросе curl я написал -d '[JSON]' и просто удалил 'вокруг [JSON] сделал трюк. Теперь Elasticsearch может прочитать запрос. Я перешел к эксперименту с предложением geo_shape вместо того, чтобы предлагать pickypg.

CORRECT: -d [JSON] 
INCORRECT: -d '[JSON]' 
Смежные вопросы