Агрегаты ElasticSearch по вложенным полям

У меня есть индекс со следующей структурой.

{
      "title": "Your top FIY tips",
      "content": "Fix It Yourself in April 2012.",
      "tags": [
        {
          "tagName": "Fix it yourself"
        },
        {
          "tagName": "customer tips"
        },
        {
          "tagName": "competition"
        }
      ]  
}

Отображение выглядит как

{
"articles": {
"mappings": {
  "article": {
    "properties": {
      "content": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "tags": {
        "type": "nested",
        "properties": {
          "tagName": {
            "type": "text",
            "fields": {
              "raw": {
                "type": "keyword"
              }
            }
          }
        }
      }
    }
  }
}
}

Я использую следующий запрос DSL для поиска в полях «содержание» и «заголовок» и сужаю результаты по определенному «tagName». Затем используйте агрегаты для подсчета имен тегов в этом запросе.

GET /articles/_search
{
  "from": 1,
  "size": 10,
  "aggs": {
    "tags": {
      "nested": {
        "path": "tags"
      },
      "aggs": {
        "tags-tagnames": {
          "terms": {
            "field": "tags.tagName.raw"
          }
        }
      }
    }
  },
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "FIY",
            "fields": [
              "title",
              "content"
            ]
          }
        },
        {
          "nested": {
            "query": {
              "terms": {
                "tags.tagName": [
                  "competition"
                ]
              }
            },
            "path": "tags"
          }
        }
      ]
    }
  }
}

Поисковый запрос и фильтр «tagNames» работают нормально. Однако агрегаты не совсем рабочие. Кажется, он не включает данные вложенного запроса в результаты. Сводные результаты, которые возвращаются, основаны только на поиске с несколькими совпадениями.

Как включить вложенный запрос в агрегаты.

Образцы документов на

https://gist.github.com/anonymous/83bc2b1bfa0ac0d295d42297e1d76c00


person level_zebra    schedule 17.03.2017    source источник
comment
как выглядит отображение в индексе, т.е. что возвращает GET {index}/_mapping? tags отображается как nested тип?   -  person Russ Cam    schedule 17.03.2017
comment
Теги @RussCam отображаются как вложенные. Обновили вопрос, чтобы включить сопоставления   -  person level_zebra    schedule 17.03.2017
comment
У вас есть небольшой пример для воспроизведения? Похоже, вы ожидаете получить необработанные имена тегов для тегов, которые включают термин competition в имени тега и соответствуют FIY в заголовке или содержимом? Разве это не то, что вы видите?   -  person Russ Cam    schedule 18.03.2017
comment
Агрегаты возвращают результаты на основе соответствия FIY в заголовке или содержании, а не фильтруют по конкуренции тегов. Запрос работает нормально. Агрегаты неверны   -  person level_zebra    schedule 18.03.2017
comment
У вас есть небольшой набор документов, с которыми я могу это проверить? При необходимости вы можете опубликовать как суть: gist.github.com. Кроме того, с какой версией Elasticsearch вы работаете?   -  person Russ Cam    schedule 18.03.2017
comment
@RussCam с использованием последней версии 5.2. Добавили документы в суть gist.github.com/anonymous/83bc2b1bfa0ac0d295d76c2200e1   -  person level_zebra    schedule 18.03.2017


Ответы (1)


После обсуждения, думаю, я лучше понимаю вашу проблему:

вы хотите запустить агрегирование только для тех документов, которые включены на основе "from" и "size", указанных в запросе.

"from" влияет только на совпадения, возвращаемые для запроса, агрегаты рассчитываются для всех документов, которые будут соответствовать запросу.

То, что вы хотите сделать, в настоящее время невозможно из-за того, как работает Elasticsearch. Поисковый запрос в Elasticsearch состоит из двух этапов:

Фаза запроса

Фаза запроса - это когда все сегменты в кластере запрашиваются, возвращаются идентификаторы документов для документов, которые соответствуют запросу. Агрегации также выполняются на этапе запроса.

Фаза загрузки

На этапе выборки фактические документы, которые соответствуют идентификаторам из фазы запроса, выбираются и включаются в результат. В вашем сценарии вам потребуется, чтобы агрегирование выполнялось на этапе выборки, чтобы агрегировать только те документы, которые были включены на этапе запроса.

Единственный способ повлиять на то, какие документы учитываются при агрегации, - это включить дополнительные запросы / фильтры в запрос запроса, но, насколько я понимаю, нет запроса, который говорит «документы в позициях порядка сортировки с 1 по 10». осведомленный.

Здесь вы всегда можете агрегировать клиентскую сторону для вашего конкретного варианта использования, так как вы эффективно агрегируете дословное значение в каждом теге.

person Russ Cam    schedule 17.03.2017