2015-09-24 2 views
0

я создал индекс с помощью:QueryParsingException [[mobapp] не удалось найти geo_point поле [location.position]

curl -XPUT localhost:9200/mobapp -d '{ 
    "mappings": { 
    "publish_messages": { 
     "properties": { 
     "title": { 
      "type": "string" 
     }, 
     "location": { 
      "type": "nested", 
      "position": { 
      "type": "geo_point" 
      }, 
      "name": { 
      "type": "string" 
      }, 
      "state": { 
      "type": "string" 
      }, 
      "country": { 
      "type": "string" 
      }, 
      "city": { 
      "type": "integer" 
      } 
     }, 
     "time": { 
      "type": "date", 
      "format": "dd-MM-YYYY" 
     } 
     } 
    } 
    } 
}' 

У меня есть этот показатель

"hits": [ 
    { 
     "_index": "mobapp", 
     "_type": "publish_messages", 
     "_id": "184123e0-6123-11e5-83d5-7bdc2a9aa3c7", 
     "_score": 1, 
     "_source": { 
     "title": "Kolkata rocka", 
     "tags": [ 
      "Tag5", 
      "Tag4" 
     ], 
     "date": "2015-09-22T12:11:46.335Z", 
     "location": { 
      "position": { 
      "lat": 11.81776, 
      "lon": 10.9376 
      }, 
      "country": "India", 
      "locality": "Bengaluru", 
      "sublocality_level_1": "Koramangala" 
     } 
     } 
    } 
    ] 

Я пытаюсь сделать запрос:

FilterBuilder filter = geoDistanceFilter("location") 
     .point(lat, lon) 
     .distance(distanceRangeInkm, DistanceUnit.KILOMETERS) 
     .optimizeBbox("memory")          
     .geoDistance(GeoDistance.ARC);   

    FilterBuilder boolFilter = boolFilter() 
     .must(termFilter("tags", tag)) 
     .must(filter); 

    GeoDistanceSortBuilder geoSort = SortBuilders.geoDistanceSort("location").point(lat, lon).order(SortOrder.ASC); 

    SearchResponse searchResponse 
      = client.prepareSearch(AppConstants.ES_INDEX) 
       .setTypes("publish_messages") 
       .addSort("time", SortOrder.DESC) 
       .addSort(geoSort) 
       .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) 
       .setPostFilter(boolFilter) 
       .setFrom(startPage).setSize(AppConstants.DEFAULT_PAGINATION_SIZE) 
       .execute() 
       .actionGet();  

Я получаю QueryParsingException[[mobapp] failed to find geo_point field [location.position]]; }

+0

Вам действительно нужно, чтобы ваше поле 'location' было типа' inested'? Другими словами, вы ожидаете, что 'location' будет содержать несколько подзаписей (и стать массивом) в какой-то момент? – Val

+0

yah Я хочу сохранить как lat, lon, так и полный адрес – manish

+0

Да, вы можете держать их вместе в стиле 'object', но вам нужно, чтобы он был« вложенным »типом? – Val

ответ

0

Если вы хотите сохранить данные о местоположении вместе, вам не нужно использовать тип nested, просто используйте обычный тип object (т. по умолчанию), как это:

curl -XPUT localhost:9200/mobapp -d '{ 
    "mappings": { 
    "publish_messages": { 
     "properties": { 
     "title": { 
      "type": "string" 
     }, 
     "location": { 
      "type": "object",  <--- use object here 
      "properties": {   <--- and don't forget properties here 
      "position": { 
       "type": "geo_point" 
      }, 
      "name": { 
       "type": "string" 
      }, 
      "state": { 
       "type": "string" 
      }, 
      "country": { 
       "type": "string" 
      }, 
      "city": { 
       "type": "integer" 
      } 
      } 
     }, 
     "time": { 
      "type": "date", 
      "format": "dd-MM-YYYY" 
     } 
     } 
    } 
    } 
}' 

Обратите внимание, что сначала нужно уничтожить ваш текущий индекс с помощью curl -XDELETE localhost:9200/mobapp, а затем воссоздать его с помощью данной команды и индексировать данные. После этого ваш запрос должен работать.

+0

никаких изменений в java-коде? – manish

+0

Вы уверены, что код Java выше, ваш последний? Потому что ошибка упоминает «location.position», в которой вы не ссылаетесь нигде в своем коде. – Val

+0

ok Позвольте мне проверить все – manish