Поиск Java-клиента Elasticsearch не работает
Я могу успешно создать индекс, используя Java API и поиск по полю источника. Моя проблема не может получить поле вложенного ключа с помощью поиска.
Например, мой образец JSON:
{
"name": "John Smith",
"age": 42,
"confirmed": true,
"join_date": "2014-06-01",
"timestamp": "14331222299",
"home": {
"lat": 51.5,
"lon": 0.1
},
"accounts": [
{
"type": "facebook",
"id": "johnsmith"
},
{
"type": "twitter",
"id": "johnsmith"
}
]
}
я могу в состоянии индексировать этот JSON как источник через API Java-клиента:-
IndexResponse response = client.prepareIndex(mohan+"-"+14-10-2014, "mohanelastic")
.setSource(jsonoutput.toString())
.execute()
.actionGet();
Мой Java-клиент поиск API:
QueryBuilder en = QueryBuilders.matchQuery("name", "John Smith");
FilterBuilder flb = FilterBuilders.andFilter(
FilterBuilders
. .rangeFilter("timestamp").from(starttimeinmilli).to(endtimeinmilli),
FilterBuilders.queryFilter(QueryBuilders.matchQuery("confirmed", "true"))
);
SearchResponse response = client.prepareSearch(mohan+"-"+14-10-2014)
.setTypes("mohanelastic")
.setSearchType(SearchType.QUERY_AND_FETCH)
.setPostFilter(flb)
.setQuery(en)
.setFrom(0).setSize(60)
.execute().actionGet();
В этом я могу получить общее количество хитов, значения ключевых полей (имя, возраст, дата соединения). Но не в состоянии получить значение ключа для (home.lat), он показывает нулевое значение. Вложенные значения для любого json показывают нуль.
Я получаю исходное поле ключей JSON, и оно показывает соответствующее значение:-
System.out.println("event type"+response.getHits().getAt(0).getSource().get("name"));
System.out.println("event type"+response.getHits().getAt(0).getSource().get("timestamp"));
Но когда я пробую home.lat, он показывает нулевое значение:
System.out.println("event type"+response.getHits().getAt(0).getSource().get("home.lat"));
1 ответ
Вы не можете получить доступ home.lat
значение с использованием точечной нотации в Java API. Думайте о вложенных объектах как о картах (home
) или список, содержащий карты (accounts
). Чтобы получить lat
Значение вам нужно будет сделать следующее:
Map<String, Object> source = response.getHits().getAt(0).getSource();
Map<String, Object> home = source.get('home');
Double latValue = (Double) home.get('lat');