Подсчитать все вхождения по полю в одном индексе - PullRequest
0 голосов
/ 07 января 2019

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

Что я пробовал до сих пор:

qry = {
"aggs": {
"field": {
"terms" : {"field": "field"}
}
}, "size": 0
}

r = es.search(body=qry,
              index="webhose_english")

Мой текущий результат:

Out[64]: 
{'_shards': {'failed': 0, 'skipped': 0, 'successful': 5, 'total': 5},
'aggregations': {'field': {'buckets': [],
'doc_count_error_upper_bound': 0,
'sum_other_doc_count': 0}},
'hits': {'hits': [], 'max_score': 0.0, 'total': 4519134},
'timed_out': False,
'took': 16}

И в идеале я хотел бы что-то вроде:

{'field_1': 321,
 'field_2': 231,
 'field_3': 132}

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Я сделал это, выполнив итерацию по следующему запросу и затем собрав «общие» значения в словаре:

qry = {
"query": {
"exists": {
"field": "fields_to_iterate"
}
}
}
0 голосов
/ 08 января 2019

Эта информация раньше была частью _field_stats API , но она была удалена в 6.0. Так что вы на правильном пути, вам понадобится агрегация. Я думаю, что value_count - это то, что вам нужно, и для хорошей меры я также добавил global, поэтому мы знаем, сколько документов в общей сложности.

Три образца документов:

PUT foo/_doc/1
{
  "foo": "bar"
}
PUT foo/_doc/2
{
  "foo": "bar",
  "bar": "bar"
}
PUT foo/_doc/3
{
  "foo": "bar",
  "bar": "bar",
  "baz": "bar"
}

Агрегирование (я не уверен, что может быть более короткая версия, особенно со многими полями):

GET foo/_search
{
  "aggs": {
    "count_fields": {
      "global": {},
      "aggs": {
        "count_foo": {
          "value_count": {
            "field": "foo.keyword"
          }
        },
        "count_bar": {
          "value_count": {
            "field": "bar.keyword"
          }
        },
        "count_baz": {
          "value_count": {
            "field": "baz.keyword"
          }
        }
      }
    }
  },
  "size": 0
}

Результат:

{
  "took" : 16,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 3,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "count_fields" : {
      "doc_count" : 3,
      "count_foo" : {
        "value" : 3
      },
      "count_bar" : {
        "value" : 2
      },
      "count_baz" : {
        "value" : 1
      }
    }
  }
}
...