Результат сканирования агрегации

Я хотел посмотреть, сколько уникальных ссылок, размещенных пользователем для каждого пользователя. Вот что я придумал до сих пор

s.aggs.bucket('user_term', A('terms', field='user__id')).metric('url_count', A('value_count', field='link'))

Тем не менее, я еще не нашел способ повторить этот результат. Есть ли способ для этого?


person Minh Triet    schedule 02.09.2019    source источник


Ответы (1)


Это не даст вам уникальный счет, просто количество документов со значением для этого поля, вместо этого вы хотите использовать cardinality:

s.aggs.bucket('users', 'terms', field='user.id').metric('url_count', 'cardinality', field='link')

r = s.execute()

for user in r.aggregations.users.buckets:
    print(f'User {user.key} posted {user.url_count.value} links')

Надеюсь это поможет

person Honza Král    schedule 02.09.2019
comment
Можно ли также добавить пример cardinality в документацию elasticseach_dsl? Я мог бы сделать запрос на вытягивание, если вы не возражаете - person Minh Triet; 03.09.2019
comment
Кроме того, это показывает только 10 результатов. Я делаю s=[:], но встретил TransportError(502). stackoverflow.com/questions/47219846/ не работает - person Minh Triet; 03.09.2019
comment
Агрегация terms по умолчанию возвращает первые 10 сегментов, вы можете указать size=50 в вызове bucket(), но для больших чисел это будет дороже. Если вы хотите получить все, рассмотрите агрегацию composite, см. пример: github.com/elastic/elasticsearch-dsl-py/blob/master/examples/ - person Honza Král; 03.09.2019