计算一个索引中每个字段的所有出现次数
Count all occurrences per field in one index
我想计算一个索引的 elasticsearch 数据库中每个字段的条目数。我试过下面的代码,但这只是 returns 条目总数。我在 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}
此信息曾经是 _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
}
}
}
}
我通过迭代以下查询然后在字典中收集 "total" 值来做到这一点:
qry = {
"query": {
"exists": {
"field": "fields_to_iterate"
}
}
}
我想计算一个索引的 elasticsearch 数据库中每个字段的条目数。我试过下面的代码,但这只是 returns 条目总数。我在 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}
此信息曾经是 _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
}
}
}
}
我通过迭代以下查询然后在字典中收集 "total" 值来做到这一点:
qry = {
"query": {
"exists": {
"field": "fields_to_iterate"
}
}
}