复合弹性搜索桶仅在两个源都存在的情况下
Composite elastic search buckets only those cases where both source exist
我有一个 elasticsearch 查询,它有一个像这样的聚合:
"aggs" : {
"my_buckets": {
"composite" : {
"sources" : [
{ "abc.firstfield":
{ "terms" :
{ "field": "abc.firstfield" }
}
},
{ "abc.secondfield":
{ "terms" :
{ "field": "abc.secondfield" }
}
}
], "size": 10000
}
}
}
最初的意图是 firstfield 和 secondfield 具有相同类型的值,并计算 ("bucketing") 在 firstfield 或 secondfield 中具有例如 ABC 的项目数。这不是分桶,因为这意味着一个文档可以进入两个桶(如果 firstfield 或 secondfield 不同)。但是继续解决我当前的问题。因此,正如我所知道的那样,这种聚合只是简单地具有 firstfield + secondfield 分桶,这对我来说也足够了。问题是,在那些情况下,例如,secondfield 丢失,没有桶是 firstfield: something, secondfield: empty。所以很多元素都从分桶中出来了。
文档说必须定义所有字段:
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-composite-aggregation.html
我该怎么做才能得到类似的结果,但像
{
"key": {
"abc.firstfield": "abcd"
},
"doc_count": 123
}
我只看到了这种可能的方法,但这意味着我必须确定 firstfield 始终可用:
"aggs": {
"first": {
"terms": {
"size": 10000,
"field": "abc.firstfield"
},
"aggs": {
"second": {
"terms": {
"size": 10000,
"field": "abc.secondfield"
}
}
}
}
}
根据我的口味,它的解析结果有点混乱。
在复合聚合中,您可以使用 missing_bucket: true
{
"aggs": {
"my_buckets": {
"composite": {
"sources": [
{
"field1": {
"terms": {
"field": "field1.keyword",
"missing_bucket": true
}
}
},
{
"field2": {
"terms": {
"field": "field2.keyword",
"missing_bucket": true
}
}
}
],
"size": 10000
}
}
}
}
结果:
"buckets" : [
{
"key" : {
"field1" : "abc",
"field2" : "xyz"
},
"doc_count" : 1
},
{
"key" : {
"field1" : "def",
"field2" : null
},
"doc_count" : 1
}
]
我有一个 elasticsearch 查询,它有一个像这样的聚合:
"aggs" : {
"my_buckets": {
"composite" : {
"sources" : [
{ "abc.firstfield":
{ "terms" :
{ "field": "abc.firstfield" }
}
},
{ "abc.secondfield":
{ "terms" :
{ "field": "abc.secondfield" }
}
}
], "size": 10000
}
}
}
最初的意图是 firstfield 和 secondfield 具有相同类型的值,并计算 ("bucketing") 在 firstfield 或 secondfield 中具有例如 ABC 的项目数。这不是分桶,因为这意味着一个文档可以进入两个桶(如果 firstfield 或 secondfield 不同)。但是继续解决我当前的问题。因此,正如我所知道的那样,这种聚合只是简单地具有 firstfield + secondfield 分桶,这对我来说也足够了。问题是,在那些情况下,例如,secondfield 丢失,没有桶是 firstfield: something, secondfield: empty。所以很多元素都从分桶中出来了。
文档说必须定义所有字段: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-composite-aggregation.html
我该怎么做才能得到类似的结果,但像
{
"key": {
"abc.firstfield": "abcd"
},
"doc_count": 123
}
我只看到了这种可能的方法,但这意味着我必须确定 firstfield 始终可用:
"aggs": {
"first": {
"terms": {
"size": 10000,
"field": "abc.firstfield"
},
"aggs": {
"second": {
"terms": {
"size": 10000,
"field": "abc.secondfield"
}
}
}
}
}
根据我的口味,它的解析结果有点混乱。
在复合聚合中,您可以使用 missing_bucket: true
{
"aggs": {
"my_buckets": {
"composite": {
"sources": [
{
"field1": {
"terms": {
"field": "field1.keyword",
"missing_bucket": true
}
}
},
{
"field2": {
"terms": {
"field": "field2.keyword",
"missing_bucket": true
}
}
}
],
"size": 10000
}
}
}
}
结果:
"buckets" : [
{
"key" : {
"field1" : "abc",
"field2" : "xyz"
},
"doc_count" : 1
},
{
"key" : {
"field1" : "def",
"field2" : null
},
"doc_count" : 1
}
]