Как группировать документы по полю в эластичном поиске с помощью spring

#elasticsearch #spring-data-elasticsearch

#elasticsearch #spring-data-elasticsearch

Вопрос:

У меня есть пользовательский документ, в котором есть различные поля, включая AddressID. Мне нужен список пользователей с другим адресом. Если у двух пользователей одинаковый AddressID, верните любого пользователя и пропустите другого.

Я пытаюсь сгруппировать пользователя по AddressID, но он не работает.

 SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).
            addAggregation(AggregationBuilders.terms("addressId").field("addressId").size(1)).
            withPageable(new PageRequest(page, size)).build();
  

Ответ №1:

Вы захотите добавить список лучших просмотров subaggregation размером 1. Это вернет один документ (т.Е. Пользователя в вашем случае) на поле AddressID.

 SearchQuery searchQuery = new NativeSearchQueryBuilder()
    .withQuery(boolQueryBuilder)
    .addAggregation(AggregationBuilders
    .terms("addressId")
    .field("addressId")
    .size(Integer.MAX_VALUE)
    .subaggregation(AggregationBuilders.topHits("justOneUserPerAddressId)
         .setSize(1)
    )
    .withPageable(new PageRequest(page, size)).build();
  

Комментарии:

1. Тем не менее, это не работает. Что такое «justOneUserPerAddressId»??

2. Агрегаты должны иметь «имя», которое может быть любой строкой. Это имя используется для получения результатов агрегирования в ответе поиска. justOneUserPerAddressId это имя agg.

3. Можете ли вы подробнее рассказать о «не работает»? Это исключение? Что такое json ответа? Что конкретно не работает?

4. Я получаю всех пользователей с одинаковым адресом, это означает, что агрегация не работает

5. Вы смотрите на агрегированную часть ответа? Он появляется в нижней части ответа после всех поисковых запросов.