过滤器在 elasticsearch 中嵌套字段的非嵌套聚合中不起作用
Filters don't work in Non-nested aggregation on nested fields in elasticsearch
我有以下 ES 映射(使用 ES 5.7.6)
{
"properties": {
"machine": {
"properties": {
"name": {
"type": "keyword"
},
"networkInterface": {
"type": "nested",
"include_in_parent": true,
"macAddress": {
"type": "keyword"
},
"name": {
"type": "text",
"fields":{
"raw":{
"type":"keyword"
}
}
}
}
}
}
}
我需要以下 -
获取嵌套字段项的机器数(父文档),并对嵌套字段进行筛选。
为了实现它,我在 networkInterface.name 上构建了一个过滤的、非嵌套的聚合。
但过滤器似乎并不适用。术语 returned 包括与过滤器不匹配的术语。
请帮助我理解为什么会出现这种行为,以及是否有办法在 ES 中实现要求。
我尝试了以下操作 -
- 'networkInterface.name' 上的非嵌套过滤术语聚合这有嵌套过滤器。
"aggregations": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"nested": {
"query": {
"term": {
"networkInterface.name.raw": "Intel(R) 12345L"
}
},
"path": "networkInterface",
"ignore_unmapped": false,
"score_mode": "none",
"boost": 1.0
}
}
]
}
},
"aggregations": {
"interfaceNames": {
"terms": {
"field": "networkInterface.name.raw",
"size": 1000,
"min_doc_count": 1,
"shard_min_doc_count": 0,
"show_term_doc_count_error": false,
"order": [
{
"_count": "desc"
},
{
"_term": "asc"
}
]
}
}
}
}
}
- 'networkInterface.name' 上的非嵌套过滤术语聚合这具有非嵌套过滤器。
"filtered": {
"filter": {
"bool": {
"must": [
{
"term": {
"networkInterface.name.raw": "Intel(R) 12345L"
}
}
],
"adjust_pure_negative": true,
"boost": 1.0
}
},
"aggregations": {
"interfaceNames": {
"terms": {
"field": "networkInterface.name.raw",
"size": 1000,
"min_doc_count": 1,
"shard_min_doc_count": 0,
"show_term_doc_count_error": false,
"order": [
{
"_count": "desc"
},
{
"_term": "asc"
}
]
}
}
}
}
}
两者return相同的结果。我只发布了整个查询的“聚合”部分,上述两种情况下的“查询”是相同的。
当运行非嵌套聚合时,嵌套上下文丢失,过滤器对聚合桶没有影响。这个结论是基于尝试多个查询。
我有以下 ES 映射(使用 ES 5.7.6)
{
"properties": {
"machine": {
"properties": {
"name": {
"type": "keyword"
},
"networkInterface": {
"type": "nested",
"include_in_parent": true,
"macAddress": {
"type": "keyword"
},
"name": {
"type": "text",
"fields":{
"raw":{
"type":"keyword"
}
}
}
}
}
}
}
我需要以下 - 获取嵌套字段项的机器数(父文档),并对嵌套字段进行筛选。
为了实现它,我在 networkInterface.name 上构建了一个过滤的、非嵌套的聚合。 但过滤器似乎并不适用。术语 returned 包括与过滤器不匹配的术语。
请帮助我理解为什么会出现这种行为,以及是否有办法在 ES 中实现要求。 我尝试了以下操作 -
- 'networkInterface.name' 上的非嵌套过滤术语聚合这有嵌套过滤器。
"aggregations": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"nested": {
"query": {
"term": {
"networkInterface.name.raw": "Intel(R) 12345L"
}
},
"path": "networkInterface",
"ignore_unmapped": false,
"score_mode": "none",
"boost": 1.0
}
}
]
}
},
"aggregations": {
"interfaceNames": {
"terms": {
"field": "networkInterface.name.raw",
"size": 1000,
"min_doc_count": 1,
"shard_min_doc_count": 0,
"show_term_doc_count_error": false,
"order": [
{
"_count": "desc"
},
{
"_term": "asc"
}
]
}
}
}
}
}
- 'networkInterface.name' 上的非嵌套过滤术语聚合这具有非嵌套过滤器。
"filtered": {
"filter": {
"bool": {
"must": [
{
"term": {
"networkInterface.name.raw": "Intel(R) 12345L"
}
}
],
"adjust_pure_negative": true,
"boost": 1.0
}
},
"aggregations": {
"interfaceNames": {
"terms": {
"field": "networkInterface.name.raw",
"size": 1000,
"min_doc_count": 1,
"shard_min_doc_count": 0,
"show_term_doc_count_error": false,
"order": [
{
"_count": "desc"
},
{
"_term": "asc"
}
]
}
}
}
}
}
两者return相同的结果。我只发布了整个查询的“聚合”部分,上述两种情况下的“查询”是相同的。
当运行非嵌套聚合时,嵌套上下文丢失,过滤器对聚合桶没有影响。这个结论是基于尝试多个查询。