Elasticsearch geo_bounding_box не удалось получить xcontent

Я сохранил несколько документов в Elasticsearch, каждый из которых содержит массив координат для рисования линии на Google Maps. В этих документах я хочу выполнить запрос 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.83210100000001 ], [ 14.997201215918253, 59.83165390720879 ], [ 14.996313, 59.83200200000001 ] ]
    }
}

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

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
                }
            }
        }
    }
}'

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

{
  "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 [org.elasticsearch.action.search.SearchRequest@866697a] 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 проверяется как правильный. Другие запросы работают правильно, я могу получить конкретный запрос по идентификатору и также получить все. Только этот запрос доставляет мне некоторые проблемы.

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

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


person Motsols    schedule 31.07.2016    source источник
comment
Не связано с проблемой, с которой вы столкнулись, но geo_bounding_box работает только с геоточками, а не с геофигурами.   -  person pickypg    schedule 31.07.2016
comment
В документации сказано, что фильтр может работать с несколькими местоположениями/точками в документе. Как только одно местоположение/точка соответствует фильтру, документ будет включен в фильтр. Linestring - это, по сути, набор точек, через которые проводится линия, или я неправильно понимаю?   -  person Motsols    schedule 01.08.2016
comment
Я полагаю, что вы неверно истолковываете. У вас может быть массив точек, который отличается от линии.   -  person pickypg    schedule 01.08.2016
comment
В таком случае знаете ли вы, что я должен использовать вместо этого для выполнения этого запроса?   -  person Motsols    schedule 01.08.2016
comment
geo_shape более гибкий геозапрос/фильтр предназначен для использования с типом данных geo_shape.   -  person pickypg    schedule 01.08.2016


Ответы (1)


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

CORRECT: -d [JSON] 
INCORRECT: -d '[JSON]'
person Motsols    schedule 22.08.2016