当前位置: 首页 > 知识库问答 >
问题:

嵌套查询在嵌套中,筛选器聚合失败

鲁永福
2023-03-14

我试图在嵌套筛选器聚合中使用嵌套查询筛选器。当我这样做时,聚合返回时没有任何项。如果我将查询更改为简单的旧match_all筛选器,我确实会在bucket中获得项。

下面是我正在使用的映射的简化版本:

"player": {
  "properties": {
    "rating": {
      "type": "float"
    },
    "playerYears": {
      "type": "nested",
      "properties": {
        "schoolsOfInterest": {
          "type": "nested",
          "properties": {
            "name": {
                "type": "string",
                "index": "not_analyzed"
            }
          }
        }
      }
    }
  }
}

该查询在聚合上使用match_all筛选器:

GET /players/_search
{
  "size": 0,
  "aggs": {
    "rating": {
      "nested": {
        "path": "playerYears"
      },
      "aggs": {
        "rating-filtered": {
          "filter": {
                "match_all": {}
          },
          "aggs": {
            "rating": {
              "histogram": {
                "field": "playerYears.rating",
                "interval": 1
              }
            }
          }
        }
      }
    }
  },
  "query": {
    "filtered": {
      "filter": {
        "match_all": {}
      }
    }
  }
}
{
   "took": 16,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 167316,
      "max_score": 0,
      "hits": []
   },
   "aggregations": {
      "rating": {
         "doc_count": 363550,
         "rating-filtered": {
            "doc_count": 363550,
            "rating": {
               "buckets": [
                  {
                     "key_as_string": "-1",
                     "key": -1,
                     "doc_count": 20978
                  },
                  {
                     "key_as_string": "0",
                     "key": 0,
                     "doc_count": 312374
                  },
                  {
                     "key_as_string": "1",
                     "key": 1,
                     "doc_count": 1162
                  },
                  {
                     "key_as_string": "2",
                     "key": 2,
                     "doc_count": 12104
                  },
                  {
                     "key_as_string": "3",
                     "key": 3,
                     "doc_count": 9558
                  },
                  {
                     "key_as_string": "4",
                     "key": 4,
                     "doc_count": 5549
                  },
                  {
                     "key_as_string": "5",
                     "key": 5,
                     "doc_count": 1825
                  }
               ]
            }
         }
      }
   }
}
GET /players/_search
{
  "size": 0,
  "aggs": {
    "rating": {
      "nested": {
        "path": "playerYears"
      },
      "aggs": {
        "rating-filtered": {
          "filter": {
              "nested": {
                "query": {
                  "match_all": {}
                },
                "path": "playerYears.schoolsOfInterest"
            }
          },
          "aggs": {
            "rating": {
              "histogram": {
                "field": "playerYears.rating",
                "interval": 1
              }
            }
          }
        }
      }
    }
  },
  "query": {
    "filtered": {
      "filter": {
        "match_all": {}
      }
    }
  }
}
{
   "took": 8,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 167316,
      "max_score": 0,
      "hits": []
   },
   "aggregations": {
      "rating": {
         "doc_count": 363550,
         "rating-filtered": {
            "doc_count": 0,
            "rating": {
               "buckets": []
            }
         }
      }
   }
}

共有1个答案

周通
2023-03-14

根据所提供的资料和一些假设,我想提供两项建议。我希望它有助于解决你的问题。

案例1:使用反向嵌套聚合:

{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "rating": {
      "nested": {
        "path": "playerYears.schoolsOfInterest"
      },
      "aggs": {
        "rating-filtered": {
          "filter": {
            "match_all": {}
          },
          "aggs": {
            "rating_nested": {
              "reverse_nested": {},
              "aggs": {
                "rating": {
                  "histogram": {
                    "field": "rating",
                    "interval": 1
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

案例2:对筛选聚合的更改:

{
  "size": 0,
  "aggs": {
    "rating-filtered": {
      "filter": {
        "nested": {
          "query": {
            "match_all": {}
          },
          "path": "playerYears.schoolsOfInterest"
        }
      },
      "aggs": {
        "rating": {
          "histogram": {
            "field": "playerYears.rating",
            "interval": 1
          }
        }
      }
    }
  },
  "query": {
    "filtered": {
      "filter": {
        "match_all": {}
      }
    }
  }
}

我建议您使用案例1并验证您所需的结果。

 类似资料:
  • 好吧,这一个对你们中的一个超级棒的弹性搜索专家来说可能不会太难。我得到了这个嵌套查询,我希望嵌套查询在一个非嵌套字段(状态)上进行过滤。我不知道把过滤器放在哪里。我试着把它放在一个查询中(如下),但没有给出正确的结果。你能帮我吗?

  • 如何聚合一个值在嵌套在Elasticsearch嵌套位置?我对一个嵌套对象没有问题,但在嵌套对象内的嵌套我感到困惑... 样本数据: 欲望结果: 在索引映射中,我将cat_a和条目字段的类型设置为嵌套,当我从工具字段查询聚合时,在cat_a的根(级别1)中没有问题,并且可以工作,但是在聚合中在rx_a(这是在第2级)我不能检索结果,它或空或显示错误,因为我的错误查询。 查询级别1 agg: 如何处

  • 问题内容: 我是elasticsearch查询和聚合的新手。我有一个带有以下映射的嵌套文档 我已插入示例数据,如下所示 我如何为以下内容构建查询DSL 员工人数最多的部门 大多数部门的员工 我正在使用Elastic Search 6.2.4 问题答案: 您的第一个问题答案是在此链接中嵌套的内部文档数哪个统计信息 这回答了您的第二个问题,同时也阅读了链接。 阅读嵌套的Agg 我希望这能给您您所需要的

  • 问题内容: 我想使用ES进行图书搜索。因此,我决定将作者姓名和标题(作为嵌套文档)放入索引,如下所示: 我不明白的是:如何构造搜索查询,以便在搜索“一二”时仅找到第二本书,而在搜索“二三”时什么也找不到,而在搜索“一”时所有图书呢? 问题答案: 也许是这样的? 该查询基本上说一个文件必须有and 。您可以轻松地重新配置该查询。例如,如果您只想搜索作者,请删除嵌套部分。如果您想要另一本书,请更改嵌套

  • 我试图查询与特定用户至少有一种共同颜色的所有用户,我已经能够做到这一点,但是我无法弄清楚如何我的结果,以便我可以得到一个用户以及他们共有的颜色。 我的示例用户文档的一部分如下: 这是我的查询,用于获取与另一个具有红色、橙色和绿色的用户相同的颜色: 如何使用共同的颜色聚合用户?

  • 我是Elasticsearch的新手,我试图创建一个过滤器来检索具有特定属性的文档。 属性在映射中定义为嵌套对象,如下所示: 我试图以以下形式执行一个复杂的查询: 这是elasticsearch 2.x。我做错了什么?