对于我对ElasticSearch的一些查询,我希望返回三条信息:
使用缺省术语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的,所以我将接收文档计数。
对于聚合,情况就不同了。全局
聚合只能用作顶部聚合,从而导致聚合忽略当前查询结果并计算索引中所有文档的聚合(例如术语聚合
)。所以对我来说,这太多了,因为我想将返回的术语(“存储桶”)限制为文档结果集中的术语。但是,如果我使用具有术语子聚合的筛选器子聚合,我会再次将术语存储桶限制为筛选器,因此不会检索文档频率,而是检索正常的分面计数。原因是桶是在过滤器之后确定的,因此它们“太小”。但我不想限制存储桶大小,我想将存储桶限制为查询结果集中的术语。
如何使用聚合获得查询结果集中这些词的文档频率(因为方面已被否决并将被删除)?
感谢您的宝贵时间!
编辑:这里有一个例子,我如何试图实现所需的行为。我将定义两个聚合:
两者的顶部都有全局
聚合,因为它是唯一有效的位置。然后,在第一次聚合中,我首先将结果过滤到原始查询,然后应用术语子聚合。在第二个聚合中,我做的基本相同,只是这里的过滤器聚合是术语聚合的子聚合。因此,相似的名称只有聚合顺序不同。
{
"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
}
}
]
}
}
}
}
首先,请查看两个聚合的前两个返回的术语桶,键为fid8
和fid6
。我们可以很容易地看到这些术语分别出现在结果集中155次和40次。现在请查看第二个聚合,global_agg_with_terms_and_filter
。术语聚合在全局聚合的范围内,所以在这里我们实际上可以看到文档频率,分别为1050和668。所以这部分看起来不错。当您进一步扫描术语桶列表时,问题就出现了,即键为fid10
到fid12
的桶。当我们收到它们的文档频率时,我们也可以看到它们的term_count
为0。这是因为这些术语没有出现在我们的查询中,我们也将它们用于过滤器子聚合。所以问题是对于所有术语(全局范围!),它们的文档频率和它们相对于实际查询结果的方面计数会被返回。但是我需要完全针对查询结果中出现的术语,即第一次聚合返回的术语global_agg_with_filter_and_terms。
也许有可能定义某种过滤器来删除子过滤器聚合< code>term_count为零< code>doc_count的所有存储桶?
你好,如果回答晚了,对不起。
您应该看看重要术语聚合,就像术语聚合一样,它为结果集中出现的每个术语返回一个bucket,其中包含通过doc_count
可用的出现次数,但您也可以通过
默认背景集包含查询范围中的所有文档,但可以使用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”字段的新计数数组,即。 非常感谢