Поиск 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');
Другие вопросы по тегам