Elasticsearch: при фильтрации по агрегации, получить общий doc_counts для этой агрегации, НО, область действия для других активных фильтров / запросов - PullRequest
1 голос
/ 14 января 2020

Я индексирую Pages, к которому я применяю агрегаты на страницах tags и authors, а также разрешаю поиск текста.

В приложении Pages всегда есть только один author, но их может быть много tags. Однако пользователь может фильтровать только по одному tag за один раз.

Когда пользователь фильтрует по tag, запрос выглядит следующим образом:

{
  query: {
    bool: {
      must: {
        match: { tags: 'Resources' }
      }
    }
  },
  aggs: {
    tags: {
      terms: { field: 'tags' }
    },
    author: {
      terms: { field: 'author' }
    }
  }
}

И очевидно, что в результате агрегации пересчитываются на основе применяемого фильтра. Итак, у вас есть doc_counts для tags, которые доступны в пределах ваших результатов.

например,

Before:
( ) Announcements - 22
( ) Media         - 10
( ) Resources     -  7
( ) Articles      -  5

After:
(*) Resources     -  7
( ) Media         -  3
( ) Articles      -  2

Для семи результатов с 'Ресурсами tag, 3 также помечены как «Media», а 2 также помечены как «Articles». Другими словами, эти итоги показывают объединение, а не общую сумму.

Вот моя проблема - я хочу, чтобы tag doc_counts был таким, каким были бы итоги, если бы фильтр не был применено. В идеале вот так:

( ) Announcements - 22
( ) Media         - 10
(*) Resources     -  7
( ) Articles      -  5

Я изучил post_filter, но это не совсем правильно. Если я возьму свой фильтр из query и введу его в post_filter, тогда итоги для моих авторов неверны.

Однако, тогда я получаю такую ​​ситуацию:

( ) Announcements - 22
( ) Media         - 10
(*) Resources     -  7
( ) Articles      -  5

Authors:
( ) James         - 22
( ) Lisa          - 10
( ) Ashley        - 22

Ожидается что-то вроде:

( ) Announcements - 22
( ) Media         - 10
(*) Resources     -  7
( ) Articles      -  5

Authors: (add up to 7)
( ) James         - 4
( ) Lisa          - 2
( ) Ashley        - 1

Если я также включу фильтр тегов в query, то я вернусь к той же проблеме, что и изначально, где я я не могу получить общие итоги.

По сути, мне нужно, чтобы мой tag doc_counts был общим (как в post_filter), но также ограничен другими фильтрами, которые были применяется.

Есть ли способ сделать это? Я долго искал и проверял документы ES, но я в растерянности.

(Примечание: очевидная возможность - разрешить несколько фильтров для агрегации, например, &tags=Resources+Articles, а затем итоги по объединению будут иметь смысл ... но это не то, чего хочет клиент).

...