Многозначное вложенное поле Агрегация в elasticsearch

Я сталкиваюсь с совершенно особой проблемой при использовании агрегации для нескольких значений и вложенных файлов в elasticsearch 5.6, и мое сопоставление индекса показано ниже:

{
"my_index": {
  "mappings": {
    "my_type": {
      "properties": {
        "my_field": {
          "type": "nested",
          "properties": {
            "name": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 256
                }
             }
           },
           "country": {
             "type": "text",
             "fields": {
               "keyword": {
                 "type": "keyword",
                 "ignore_above": 256
               }
             }
           },
         }
       }
     }
   }
 }
}

и мои данные такие:

"my_field": [
  {"name": "apple", "country": "USA"},
  {"name": "alibaba", "country": "CHINA"}
]

требование таково: я получаю слово запроса, например. apple, и я использую это слово запроса для поиска в поле name, наконец, я хочу агрегировать по стране, чье имя strong> — это слово запроса яблоко. мой запрос показан ниже:

{"query": {
"nested": {"path": "my_field", "query": {"bool": {"should": [{"match": {"my_field.name.keyword": "apple"}}]}}}},
 "aggs": {"m_agg": {"nested": {"path": "my_field"},
                    "aggs": {"m1_agg": {"terms": {"field": "my_field.country.keyword"}}}}}}

таким образом, входным значением будет яблоко, а ожидаемым результатом будет

"aggregations" : {
"m_agg" : {
  "doc_count" : 1,
  "m1_agg" : {
    "doc_count_error_upper_bound" : 0,
    "sum_other_doc_count" : 0,
    "buckets" : [
      {
        "key" : "USA",
        "doc_count" : 1
      }
    ]
  }
}
}

но elasticsearch возвращает результат:

"aggregations" : {
"m_agg" : {
  "doc_count" : 2,
  "m1_agg" : {
    "doc_count_error_upper_bound" : 0,
    "sum_other_doc_count" : 0,
    "buckets" : [
      {
        "key" : "USA",
        "doc_count" : 1
      },
      {
        "key" : "CHINA",
        "doc_count" : 1
      }
    ]
  }
}
}

Как изменить запрос DSL, чтобы получить ожидаемый результат?


person L. Fang    schedule 19.12.2017    source источник


Ответы (2)


В случае вложенных полей раздел запроса не повлияет на раздел агрегатов.

Чтобы решить эту проблему, попробуйте следующее:

{
  "size": 0,
  "aggregations": {
    "nested_agg": {
      "nested": {
        "path": "name"
      },
      "aggregations": {
        "bool_agg": {
          "filter": {
            "bool": {
              "must": [
                {
                  "term": {
                    "my_field.name.keyword": "apple"
                  }
                }
              ]
            }
          },
          "aggregations": {
            "m_agg": {
              "nested": {
                "path": "my_field"
              },
              "aggregations": {
                "m1_agg": {
                  "terms": {
                    "field": "my_field.country.keyword"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

См. раздел Вложенное агрегирование и Агрегация фильтров

person Eli    schedule 01.01.2018

Если вам нужно применить агрегацию к определенным отфильтрованным значениям. Вы должны использовать фильтры внутри агрегации.

В Elastic написанные отдельно запрос/фильтры и агрегация будут приводиться отдельно вне зависимости друг от друга.

person kumarc    schedule 26.01.2018