Получить количество определенного поля в документе с помощью Elasticsearch

Требование: я хочу найти количество aID для определенного идентификатора категории. (т.е. для идентификатора категории 2532 я хочу, чтобы счетчик был равен 2, что означает, что он назначен двум идентификаторам AID).

Я пробовал с агрегациями, но с этим я могу получить только количество документов, а не количество полей.

Сопоставления

 "List": {
            "properties": {

              "aId": {
                "type": "long"
              },
              "CategoryList": {
                "properties": {                  
                  "categoryId": {
                    "type": "long"
                  },
                  "categoryName": {
                    "type": "string"
                  }
                }
              }              
            }
          }

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

"List": [
            {
              "aId": 33074,           
              "CategoryList": [
                {
                  "categoryId": 2532,
                  "categoryName": "VODAFONE"                
                }
              ]
            },
        {
              "aId": 12074,           
              "CategoryList": [
                {
                  "categoryId": 2532,
                  "categoryName": "VODAFONE"                
                }
              ]
            },

        {
              "aId": 120755,           
              "CategoryList": [
                {
                  "categoryId": 1234,
                  "categoryName": "SMPLKE"                
                }
              ]
            }
          ]

person Private    schedule 08.02.2017    source источник


Ответы (1)


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

Вы можете использовать следующий запрос. Здесь вы можете сначала отфильтровать документ по CategoryList.categoryId, а затем запустить простую агрегацию терминов в этом поле

POST index_name1111/_search
{
    "query": {
        "bool": {
            "must": [{
                "term": {
                    "CategoryList.categoryId": {
                        "value": 2532
                    }
                }
            }]
        }
    },
    "aggs": {
        "count_is": {
            "terms": {
                "field": "CategoryList.categoryId",
                "size": 10
            }
        }
    }
}

Ответ на вышеуказанный запрос —

{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "count_is": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": 2532,
          "doc_count": 2
        }
      ]
    }
  }
}

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

POST index_name1111/_search
{
size: 0,
  "aggs": {
    "count_is": {
      "terms": {
        "field": "CategoryList.categoryId",
        "size": 10
      }
    }
  }
}

Ответ на вышеуказанный запрос

    {
      "took": 2,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
      },
      "hits": {
        "total": 3,
        "max_score": 0,
        "hits": []
      },
      "aggregations": {
        "count_is": {
          "doc_count_error_upper_bound": 0,
          "sum_other_doc_count": 0,
          "buckets": [
            {
              "key": 2532,
              "doc_count": 2
            },
            {


        "key": 1234,
          "doc_count": 1
        }
      ]
    }
  }
}

Используя агрегацию количества элементов, вы получите следующий ответ со следующим запросом

POST index_name1111/_search
{
    "size": 0,
    "query": {
        "bool": {
            "must": [{
                "term": {
                    "CategoryList.categoryId": {
                        "value": 2532
                    }
                }
            }]
        }
    },
    "aggs": {
        "id_count": {
            "cardinality": {
                "field": "CategoryList.categoryId"
            }
        }
    }
}

Ответ на приведенный выше запрос, который не дает желаемого результата, поскольку два документа соответствуют обоим с идентификатором категории как 252, поэтому количество различных 1.

{
  "took": 4,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "id_count": {
      "value": 1
    }
  }
}

Надеюсь, это поможет Спасибо

person user3775217    schedule 08.02.2017
comment
Старый пост, но на всякий случай, если кто-то еще ищет это, этот ответ не отвечает на настоящий вопрос. Вопрос касается 1 документа с несколькими полями в этом 1 документе. Этот ответ предназначен для 3 документов, а не для 1 документа. - person doeiqts; 01.05.2018