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

从Elasticsearch中的每个聚合返回第一个“术语”命中

沃盛
2023-03-14

使用Elasticsearch聚合,是否可以只返回每个聚合的第一次命中?我没有在弹性文档中找到详细的此功能

{
took: 1,
timed_out: false,
_shards: {
  total: 5,
  successful: 5,
  failed: 0
},
hits: {
  total: 2,
  max_score: 0.7380617,
hits: [
  {},
  {}
]
}
}

我使用top\u hits聚合来确保每个聚合的第一次命中是相关的命中,因此如果我可以在单独的列表中只返回每个聚合的第一次命中,那就太好了。这是可能的,还是需要通过编程方式循环聚合查询结果?

共有1个答案

翁鸿远
2023-03-14

当您执行聚合时,您希望检查结果中的聚合json,而不是命中。由于您已经知道Top命中聚合,请注意它提供了一个size选项,因此只需将其设置为1,您将获得每个桶一次命中。

在本例中,我通过索引中名为catL1的字段进行聚合,而top categories是我选择的聚合名称:

{
    "aggs": {
        "top-categories": {
            "terms": {
                "field": "catL1"
            },
            "aggs": {
                "top-categories_hits": {
                    "top_hits": {
                        "size" : 1
                    }
                }
            }
        }
    }
}

现在我的结果是:

{
    "took": 33,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
        "total": 1248280,
        "max_score": 1,
        "hits": [
            ...
        ]
    },
    "aggregations": {
        "top-categories": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 217939,
            "buckets": [
                {
                    "key": "category1",
                    "doc_count": 412189,
                    "top-categories_hits": {
                        "hits": {
                            "total": 412189,
                            "max_score": 1,
                            "hits": [
                                ONLY_1_HIT
                            ]
                        }
                    }
                },
 {
                    "key": "category2",
                    "doc_count": 3000189,
                    "top-categories_hits": {
                        "hits": {
                            "total": 3000189,
                            "max_score": 1,
                            "hits": [
                                ONLY_1_HIT
                            ]
                        }
                    }
                }

            ]
        }
    }
}

您可以看到,有一个名为聚合的json,它每个bucket只包含一个命中(我用占位符替换了命中)

编辑:当然,您可能也对总的点击感兴趣,但我的意思是聚合是您在这个问题的上下文中寻找的

 类似资料:
  • 问题内容: 我正在尝试使用以下查询对以下数据进行elasticsearch来执行术语聚合,输出将名称分解为标记(请参见下面的输出)。因此,我尝试将os_name映射为multi_field,但现在无法通过它查询。是否可以有没有令牌的索引?例如“ Fedora Core”? 查询: 数据: 输出: 映射: 问题答案: 实际上,您应该像这样更改映射 并且您的aggs应该更改为:

  • 问题内容: 如何编写一个将整个字段值而不是单个标记考虑在内的ElasticSearch术语聚合查询?比如,我想通过城市名聚集,但下面的回报,,并作为单独的水桶,不和的水桶预期。 问题答案: 您应该在映射中解决此问题。添加一个not_analyzed字段。如果您还需要分析的版本,则可以创建多字段。 现在在city.raw上创建聚合

  • 问题内容: 我想过滤出字段“ A”等于“ a”的文档,并且我想同时考虑字段“ A”,当然不包括先前的过滤器。我知道您可以将过滤器“置于查询之外”,以便在不应用该过滤器的情况下获得构面,例如: elasticsearch 单反 这非常好,但是如果我有多个滤镜和构面,每个滤镜和构面应该互相排斥,会发生什么?例: 也就是说,对于方面AI,希望保留除A:a以外的所有过滤器,对于方面B希望保留除B:b以外的

  • 我想过滤掉字段'a'等于'a'的文档,同时我想对字段'a'进行刻面处理,当然不包括前面的过滤器。我知道您可以将筛选器放在查询的“外部”,以便在不应用该筛选器的情况下获得方面,例如: 弹性搜索 索尔尔 也就是说,对于方面A,我希望保留除A:A以外的所有过滤器,对于方面B,我希望保留除B:B以外的所有过滤器,以此类推。最明显的方法是执行n个查询(n个方面中的每一个),但我不想这样做。

  • 这个问题不是如何通过多个字段进行聚合,我们可以使用子聚合。 如果你知道SQL,我可以给你一个完美的解释: 我们能在Elasticsearch中实现这一点吗? 谢谢。

  • 此处为elasticsearch新用户,但存在术语聚合问题。我为187份文档编制了索引,其中包含“名称”、“主机”、“风险”等字段。字段风险有4个唯一值(“关键”、“高”、“中”、“低”、“信息”),我正在运行这样的术语聚合: 我希望得到一个结果,说明我有x个临界值,x个高值等等。问题是,我没有得到返回的桶。 我的Elasticsearch版本是7.12.0有什么想法吗 > 编辑:这是映射: 以下