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

使用聚合检索查询结果中术语的文档频率

马弘益
2023-03-14

对于我对ElasticSearch的一些查询,我希望返回三条信息:

  • 结果文档集中出现了哪些术语T?
  • T的每个元素在结果文档集中出现的频率是多少?
  • T的每个元素在整个索引(--

使用缺省术语facet或现在的术语aggregation方法可以很容易地确定第一点。所以我的问题其实是关于第三点。在ElasticSearch 1.x之前,即在切换到“聚合”范式之前,我可以使用一个term facet,将“global”选项设置为< code>true和一个< code>QueryFilter来获取在< code>QueryFilter指定的文档集中出现的确切术语的文档频率(“全局计数”)。起初,我认为我可以使用< code >全局聚合做同样的事情,但似乎我不能。原因是——如果我理解正确的话——最初的< code>facet机制是以术语为中心的,而聚合桶是由属于每个桶的文档集定义的。即,用< code>QueryFilter指定< code>term facet的< code>global选项首先确定过滤器命中的术语,然后计算facet值。因为facet是< code>global的,所以我将接收文档计数。

对于聚合,情况就不同了。全局聚合只能用作顶部聚合,从而导致聚合忽略当前查询结果并计算索引中所有文档的聚合(例如术语聚合)。所以对我来说,这太多了,因为我想将返回的术语(“存储桶”)限制为文档结果集中的术语。但是,如果我使用具有术语子聚合的筛选器子聚合,我会再次将术语存储桶限制为筛选器,因此不会检索文档频率,而是检索正常的分面计数。原因是桶是在过滤器之后确定的,因此它们“太小”。但我不想限制存储桶大小,我想将存储桶限制为查询结果集中的术语。

如何使用聚合获得查询结果集中这些词的文档频率(因为方面已被否决并将被删除)?

感谢您的宝贵时间!

编辑:这里有一个例子,我如何试图实现所需的行为。我将定义两个聚合:

  • global_agg_with_filter_and_terms
  • 带有terms_and_filter的全局agg

两者的顶部都有全局聚合,因为它是唯一有效的位置。然后,在第一次聚合中,我首先将结果过滤到原始查询,然后应用术语子聚合。在第二个聚合中,我做的基本相同,只是这里的过滤器聚合是术语聚合的子聚合。因此,相似的名称只有聚合顺序不同。

{
    "query": {
        "query_string": {
            "query": "text: my query string"
        }
    },
    "aggs": {
        "global_agg_with_filter_and_terms": {
            "global": {},
            "aggs": {
                "filter_agg": {
                    "filter": {
                        "query": {
                            "query_string": {
                                "query": "text: my query string"
                            }
                        }
                    },
                    "aggs": {
                        "terms_agg": {
                            "terms": {
                                "field": "facets"
                            }
                        }
                    }
                }
            }
        },
        "global_agg_with_terms_and_filter": {
            "global": {},
            "aggs": {
                "document_frequency": {
                    "terms": {
                        "field": "facets"
                    },
                    "aggs": {
                        "term_count": {
                            "filter": {
                                "query": {
                                    "query_string": {
                                        "query": "text: my query string"
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

回应:

{
    "took": 18,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
        "total": 221,
        "max_score": 0.9839197,
        "hits": <omitted>
    },
    "aggregations": {
        "global_agg_with_filter_and_terms": {
            "doc_count": 1978,
            "filter_agg": {
                "doc_count": 221,
                "terms_agg": {
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0,
                    "buckets": [
                        {
                            "key": "fid8",
                            "doc_count": 155
                        },
                        {
                            "key": "fid6",
                            "doc_count": 40
                        },
                        {
                            "key": "fid9",
                            "doc_count": 10
                        },
                        {
                            "key": "fid5",
                            "doc_count": 9
                        },
                        {
                            "key": "fid13",
                            "doc_count": 5
                        },
                        {
                            "key": "fid7",
                            "doc_count": 2
                        }
                    ]
                }
            }
        },
        "global_agg_with_terms_and_filter": {
            "doc_count": 1978,
            "document_frequency": {
                "doc_count_error_upper_bound": 0,
                "sum_other_doc_count": 0,
                "buckets": [
                    {
                        "key": "fid8",
                        "doc_count": 1050,
                        "term_count": {
                            "doc_count": 155
                        }
                    },
                    {
                        "key": "fid6",
                        "doc_count": 668,
                        "term_count": {
                            "doc_count": 40
                        }
                    },
                    {
                        "key": "fid9",
                        "doc_count": 67,
                        "term_count": {
                            "doc_count": 10
                        }
                    },
                    {
                        "key": "fid5",
                        "doc_count": 65,
                        "term_count": {
                            "doc_count": 9
                        }
                    },
                    {
                        "key": "fid7",
                        "doc_count": 63,
                        "term_count": {
                            "doc_count": 2
                        }
                    },
                    {
                        "key": "fid13",
                        "doc_count": 55,
                        "term_count": {
                            "doc_count": 5
                        }
                    },
                    {
                        "key": "fid10",
                        "doc_count": 11,
                        "term_count": {
                            "doc_count": 0
                        }
                    },
                    {
                        "key": "fid11",
                        "doc_count": 9,
                        "term_count": {
                            "doc_count": 0
                        }
                    },
                    {
                        "key": "fid12",
                        "doc_count": 5,
                        "term_count": {
                            "doc_count": 0
                        }
                    }
                ]
            }
        }
    }
}

首先,请查看两个聚合的前两个返回的术语桶,键为fid8fid6。我们可以很容易地看到这些术语分别出现在结果集中155次和40次。现在请查看第二个聚合,global_agg_with_terms_and_filter。术语聚合在全局聚合的范围内,所以在这里我们实际上可以看到文档频率,分别为1050和668。所以这部分看起来不错。当您进一步扫描术语桶列表时,问题就出现了,即键为fid10fid12的桶。当我们收到它们的文档频率时,我们也可以看到它们的term_count为0。这是因为这些术语没有出现在我们的查询中,我们也将它们用于过滤器子聚合。所以问题是对于所有术语(全局范围!),它们的文档频率和它们相对于实际查询结果的方面计数会被返回。但是我需要完全针对查询结果中出现的术语,即第一次聚合返回的术语global_agg_with_filter_and_terms

也许有可能定义某种过滤器来删除子过滤器聚合< code>term_count为零< code>doc_count的所有存储桶?

共有1个答案

华萧迟
2023-03-14

你好,如果回答晚了,对不起。

您应该看看重要术语聚合,就像术语聚合一样,它为结果集中出现的每个术语返回一个bucket,其中包含通过doc_count可用的出现次数,但您也可以通过 bg_count获得背景集中出现的次数。这意味着它只为查询结果集的文档中出现的术语创建bucket。

默认背景集包含查询范围中的所有文档,但可以使用background_filter向下筛选到任何想要的子集。

您可以使用脚本化的存储桶评分功能,通过组合多个指标,按照您想要的方式对存储桶进行排名:

  • _subset_freq:术语出现在结果集中的文档数,
  • _superset_freq:术语出现在背景集中的文档数,
  • _subset_size:结果集中的文档数,
  • _superset_size:后台集中的文档数

请求:

{
  "query": {
    "query_string": {
      "query": "text: my query string"
    }
  },
  "aggs": {
    "terms": {
      "significant_terms": {
        "script": "_subset_freq",
        "size": 100
      }
    }
  }
}
 类似资料:
  • 问题内容: 我有两种日志消息: 第一个消息是已发送消息的类型,第二个消息是确认消息已传递的消息。 它们之间的区别是后缀,我已将其与“ id”分开并可以对其进行查询。 这些消息将按以下格式解析并存储在elasticsearch中: 我想找出哪些消息已成功发送,哪些没有成功。我是Elasticsearch的初学者,所以我真的很努力。 我目前正在尝试术语聚合,但是我所能实现的就是以下代码: 向我显示已发

  • 这是我的ES查询: ==创建索引=== ===插入数据=== ==获取结果的查询=== ==检索到的结果=== ==期望结果=== 所需术语按文档搜索术语的频率,如下所示 我尝试过Bucket聚合、Terms聚合和其他聚合,但没有得到这个结果。 提前谢谢你的帮助!

  • 我有以下JPA实体(getter、setter和非相关字段省略): 我的目标是使用JPQL或criteriaAPI实现查询,它将返回每天的平均事务量和最大事务量。 产生预期结果的原生SQL查询(MySQL数据库)如下所示: 遗憾的是,不鼓励使用本机 SQL 查询,并且 JPQL 不允许在 where 子句中使用子查询。 提前谢谢你。 附加: 我从以下Spring数据查询开始: 但显然没有用: 我可

  • 我使用聚合从嵌套字段收集数据并卡住了一点 文件示例: ES允许通过rectangle.attributes._id来分组数据,但是有没有办法让一些“其他”桶把没有添加到任何组中的文档放在那里?或者,也许有一种方法可以通过创建查询来为文档创建桶。我认为桶将是完美的,因为我需要使用“其他”文档进行进一步的聚合。或者也许有一些很酷的解决方法 我使用这样的查询进行聚合 然后得到这个结果 这样的结果将是完美

  • 我试图构建一个Spring Boot REST API,从MySQL DB中获取数据。这是我在Spring Boot REST API应用程序的存储库代码中定义的JPA查询方法: 这是我要查询的表的详细信息:

  • 我不熟悉Mongo中的聚合查询,并且一直在努力产生我想要的输出。我有以下聚合查询: 返回以下结果: 如何修改聚合查询,以便只返回2个文档而不是3个文档?将两个“ABC-123”结果合并为一个结果,并使用带有“bu”和“count”字段的新计数数组,即。 非常感谢