Группировка результатов

236 views
Skip to first unread message

Константин Шишкин

unread,
May 22, 2013, 8:34:20 AM5/22/13
to elastics...@googlegroups.com
Здравствуйте.

Не подскажите, как в ES сделать группировку подобную sql GROUP_BY. 
Про facetы я в курсе, но нужно не совсем это (либо я не понял как их готовить правильно)

Индекс продуктов вида:
  • Название продукта
  • ID компании
  • и другие поля
таких записей порядка 500-600 тысяч.
При выводе мне нужно сгруппировать результаты по ID компании, так чтобы в выдаче был только один продукт от одной фирмы.

Возможно ли это?

Заранее спасибо.

Igor Motov

unread,
May 22, 2013, 10:54:19 AM5/22/13
to elastics...@googlegroups.com
В elasticsearch пока что нет эквивалента group by. Так что группировать придется либо на клиенте, либо выполнять запрос в два этапа с помощью top_children. Для этого надо будет проиндексировать продукты как дочерние записи компаний, запрос top_children в этом случае вернет список компаний, которые имеют продукты удовлетворяющие запросу, и потом для каждой компании можно повторить поиск для того, что бы получить один продукт. Последние поиски можно объединить в один multi_search. На большом индексе это не пройдет, но для 500-600 тыс, думаю, результаты будут вполне приемлемы по времени. 

Константин Шишкин

unread,
May 22, 2013, 12:23:01 PM5/22/13
to elastics...@googlegroups.com
Огромное спасибо. Я что то не подумал про top_children индекс. Косвенно, за одно это решит еще несколько проблем.

среда, 22 мая 2013 г., 16:34:20 UTC+4 пользователь Константин Шишкин написал:

Nikolay Eryomin

unread,
May 5, 2015, 3:04:09 PM5/5/15
to elastics...@googlegroups.com
Добрый день. хотелось бы поднять старую тему.
В целом вопрос похожий, только хочу немного дополнить. Необходимо для компании выводить самый подходящий под условия поиска продукт, при этом их сортировать по дате регистрации.
Т.е. на выходе необходимо иметь по 1 продукту каждой компании отсортированные по дате регистрации.

например.
Исходные данные:
компания 1
   продукт 1-1 "test" зарегистрирован 01.01.2015
   продукт 1-2 "other" зарегистрирован 01.01.2014
компания 2
   продукт 2-1 "other" зарегистрирован 01.02.2015
   продукт 2-2 "test" зарегистрирован 01.02.2014
   продукт 2-2 "test and other" зарегистрирован 01.03.2015

при поиске по слову test на выходе необходимо иметь:
продукт 1-1 "test" зарегистрирован 01.01.2015
продукт 2-2 "test" зарегистрирован 01.02.2014

Используя top_children, да и вообще связь paren-child настроить такую сортировку не удалось.
Как в общем-то не удалось еще настроить использую nested.


среда, 22 мая 2013 г., 17:54:19 UTC+3 пользователь Igor Motov написал:

Igor Motov

unread,
May 5, 2015, 3:22:21 PM5/5/15
to elastics...@googlegroups.com
Много что изменилось за 2 года. Теперь этого можно легко добиться с помощью агрегатора Top Hits

Nikolay Eryomin

unread,
May 6, 2015, 4:53:54 AM5/6/15
to elastics...@googlegroups.com
При помощи Top Hits мы можем вывести по 1 продукту для каждой компании, но нет возможности отсортировать компании.
Причем отсортировать надо именно по дате регистрации продукта, который мы выводим для этой компании. При этом хотелось бы чтобы и from и size тоже работали.

Идеальный вариант, чтобы выдавался не 1 продукт, а все продукты для каждой компани отсортированные по _score. При этом компании должны быть отсортированы по дате продукта с наивысшим _score.

вторник, 5 мая 2015 г., 22:22:21 UTC+3 пользователь Igor Motov написал:

Igor Motov

unread,
May 7, 2015, 11:10:55 PM5/7/15
to elastics...@googlegroups.com, nikolay...@gmail.com
Почему-же нет возможности? Можно сортировать как угодно - хоть по score, хоть по дате, а можно один список по дате, а другой по score

https://github.com/imotov/elasticsearch-test-scripts/blob/master/group_by.sh

From и size не работают потому, что для группировки все-равно все записи надо выбирать. Поэтому просто задайте size и игнорируйте первые from записей. 
Reply all
Reply to author
Forward
0 new messages