问题标签 [elasticsearch-aggregation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
45 浏览

elasticsearch - 在嵌套字段上使用过滤器时聚合嵌套字段

我们使用 Elasticsearch 作为库搜索界面。我们的问题是在嵌套字段上使用过滤器时为嵌套字段获取正确的聚合数。

我们的映射可以最好地概括为: 一部作品,有零个或多个出版物。为酿造而简化的映射:

在我们的搜索结果中,我们展示了作品,但我们过滤了他们出版物中的语言和格式。此外,聚合是关于语言和格式的。聚合中的存储桶用于在 Web UI 中向用户显示过滤选项: 图片显示我们的过滤器类别和过滤器

作为参考,这里是一个示例查询,其中启用了格式“Book”和语言“Norwegian”的过滤器:查询

搜索结果是正确的。应用格式“书”和语言“挪威语”只会返回出版物既是书本又是挪威语的作品。应用“书籍”格式以及“挪威语”和“瑞典语”语言将仅返回出版物为挪威语书籍或瑞典语书籍的作品。

问题是聚合数字(显示为过滤器后括号中的数字)不是正确的。正确的行为是这样的:

例如,当应用过滤器“Book”并且您从聚合中返回的是“Finnish (3)”时,那么 3 应该表示工作结果中总共有 3 个出版物是芬兰书籍。

相反,会发生这样的事情:

显示的数字只是芬兰语出版物的数量,但不限于书籍,还可以是其他格式,例如 DVD 或蓝光音频。如果没有芬兰语书籍,用户甚至可能在启用芬兰语过滤器时得到“无结果”。

任何有关如何解决此问题的提示将不胜感激!

0 投票
1 回答
1372 浏览

elasticsearch - 根据总文档过滤掉 top_hits 子聚合

我正在使用 Elasticsearch GeoHash 网格聚合进行地图聚类。该查询平均返回 100-200 个桶。每个存储桶都使用 top_hits 聚合,我使用它为每个聚合集群返回 3 个文档。

问题是我只想在父聚合(GeoHash)聚合不超过 3 个文档时返回 top_hits。

如果一个集群聚合了超过 3 个文档,我不希望 ES 返回该集群的任何文档(因为我不会使用它们)。

我尝试使用Bucket Selector Aggregation,但未能构建正确的bucket_path。我在与 top_hits 聚合相同的级别上使用存储桶选择器聚合。一个存储桶的总文档数可在top_hits.hits.total但我得到的是reason=path not supported for [top_hits]: [hits.total].

这在弹性搜索中可能吗?这对我来说很重要,因为在大多数查询中,只有一小部分存储桶的文档少于 3 个。但是即使对于 1000 个文档的集群,top hits 子聚合也总是返回前 3 个文档。如果查询结果返回 200 个存储桶,其中只有 5 个在聚合 <= 3 个文档,那么我只想返回 5*3 个文档,而不是 200*3(在这种情况下,响应为 10MB)。

这是我的查询的 aggs 部分:

0 投票
1 回答
5469 浏览

elasticsearch - 将聚合结果插入索引

目标是建立一个 Elasticsearch 索引,其中仅包含相关文档组中的最新文档,以跟踪某些监控计数器和状态的当前状态。

我制作了一个简单的Elasticsearch 聚合查询

它将相关文档分组到存储桶中,并为每个存储桶选择最新的文档。

以下是我完成工作所必须的不同想法:

  1. 直接使用聚合查询将结果推送到索引中,但似乎不可能:是否可以将 ElasticSearch 聚合的结果放回索引中?
  2. 使用Logstash Elasticsearch 输入插件执行聚合查询,使用Elasticsearch 输出插件推入索引,但似乎输入插件只查看hits字段,无法处理聚合结果:聚合查询可能输入 ES 插件
  3. 使用Logstash http_poller 插件获取 JSON 文档,但它似乎不允许为 HTTP 请求指定正文!
  4. 使用Logstash exec 插件执行 cURL 命令来获取 JSON,但这似乎很麻烦,也是我最后的手段。
  5. 使用NEST API构建一个基本应用程序,该应用程序将执行轮询、提取结果、清理它们并将结果文档注入目标索引,但我想避免添加新工具来维护。

有没有一种相当复杂的方法来实现这一点?

0 投票
0 回答
114 浏览

elasticsearch - 获取原始的 elasticsearch sum_bucket 而不是对可见的存储桶数据求和

我们可以从弹性搜索聚合中得到原始存储桶(所有聚合结果)数据的总和而不显示所有存储桶结果吗?我正在使用弹性搜索 2.2。

例如:这是原始查询的原始结果(只是为了简单起见)

这就是我想要的

鉴于桶没有显示所有结果桶,但sum_bucket给出了结果桶的实际总和。

我可以得到所有聚合的总和,但我需要包括所有桶。这将需要很长时间才能传输结果,因为结果太大。我很抱歉我的英语不好。

0 投票
1 回答
237 浏览

elasticsearch - 弹性搜索根据条件聚合到存储桶中

我从 Elastic Search 开始,一直在尝试进行一些聚合。基本上,我有一个由以下形式的数据组成的数据集:

现在,我想做一些聚合,并在一个查询中获取纽约的所有欧式餐厅、好餐厅、餐厅。

请注意,我不想要所有类型餐厅的数量,我只想要特定类型的数量。此外,这些聚合是相互独立的。也就是说,当我说 GOOD 时,我不一定希望它是 Continental,它可以是意大利语或其他任何东西。

这是我尝试过的:

这给了我错误:

我知道这似乎是一个简单的问题,但我已经坚持了很长时间。任何帮助将不胜感激。

0 投票
0 回答
74 浏览

elasticsearch - 使用范围过滤器的弹性搜索中的问题

我正在使用 Elastic Search 并尝试使用来自 angularjs UI 页面的聚合查询来获取数据,我们正在使用 Elasticseach.js、Elastic.js 等插件

发布请求并获得响应,一切都在这里为我工作,除了日期范围过滤器意味着范围过滤器不起作用。以下是我用于发布请求的查询:-

这里“purchaseDate”是弹性搜索索引中我试图应用范围过滤器的字段。

它的json形式是:-

如果有人可以,我需要帮助,我将不胜感激。

0 投票
0 回答
123 浏览

elasticsearch - 不同字段上 top_hits 上的 Elasticsearch 聚合

我正在尝试对一组过滤的文档执行聚合;但是,过滤器细节需要​​使用聚合(每个“申请人”的最新“测试”)。顶级聚合将在文档的一个字段上完成,但在与执行过滤聚合的字段不同的字段上。

例如(我在这里建立另一个用户的问题:查询或过滤最小字段值?)。

给定以下一组文档:

我们有兴趣了解有多少用户在每个类别中得分最高。

换句话说,我们想要:

  1. 只过滤每个用户得分最高的测试
  2. 根据主题对结果进行分组(和计数)。

因此,对于第 1 步,我们应该只保留:

对于第 2 步,按主题对它们进行分组:

问题是,如果我使用 aggregation/top_hits 进行过滤:

我的第一步是正确的(top_hits),但是如果我通过'topic'添加'parent'聚合,top_hits聚合将不再正常工作,因为'applicants'将在不同的'topic'存储桶之间混合,因此聚合最高分数将不正确。

看起来最好的方法是在“主题”聚合之前使用查询过滤器,但我无法创建这样的过滤器,以便它只保留每个申请人的最高得分测试。

有任何想法吗?

0 投票
0 回答
506 浏览

elasticsearch - 弹性中的子聚合或聚合过滤器

我有一个带有名称和时间戳的记录列表。对于每个名称,我想获得最大时间戳,但我只想在一小时前获得具有最大时间戳的名称(这意味着在我的结果中我只想查看名称列表及其最大时间戳,但仅适用于一个小时前具有最大时间戳的名称。如果一个名称有一小时前的时间戳记录,我不想在我的结果中看到这个名称)。

我尝试使用聚合来解决这个问题,通过在名称上创建术语聚合,然后聚合最大时间戳,然后在一小时前过滤具有最大时间戳的记录,如下所示:

但是,此查询会产生以下错误:

我基本上可以通过在最大聚合之前使用时间戳过滤器来获得类似的功能,如下所示:

实际上,对于通过最大值过滤器的每个名称,我得到一组结果,其中包含名称和 max_timestamp,对于每个未通过最大值过滤器的名称,我得到一个空的 max_timestamp。这是我可以使用的解决方案,但是,由于为每个名称运行的最大值过滤器,此查询不会返回大量记录。

在此先感谢您的帮助。

0 投票
1 回答
441 浏览

java - 基于 Unix 时间戳的 Java 范围聚合

在我们的弹性搜索(2.3.1 版)索引showDate中,每个文档都有一个字段。此字段包含一个 unix 时间戳,我想找出showDate过去 24 小时内有多少文档showDate以及过去 7 天有多少文档。

在我的 Java 代码中,这是我尝试完成此操作的方式:

当我执行此搜索请求并查看生成的查询时,我会得到类似这样的信息

当我在KopfHead等插件中执行查询时,我得到了预期的结果。当我在我的 java 服务中执行它时,docCount 始终为 0。

我注意到的唯一区别是插件将双精度值转换为长值。因此,在我发送查询后,1.465455690E9数字将转换为1465455690. 有谁知道我如何在 Java 服务中获得与从插件中获得相同的结果?

更新 1 感谢 Dimitris 的回答,我的代码如下所示。但是它仍然没有给出预期的结果。即使 Head 和 Kopf 告诉我有结果,DocCount 仍然始终为 0。

更新 2: 我的最终解决方案如下所示:

我还必须更改我的索引,以便它showDate是日期类型(格式仍然是 epoch_second)。

0 投票
2 回答
4078 浏览

elasticsearch - Elasticsearch SQL 类似子查询聚合

我正在玩 ES 以了解它是否可以涵盖我的大部分场景。我正处于思考如何达到在 SQL 中非常简单的特定结果的地步。

这是示例

在弹性中,我有这个文档的索引

如果我想知道在 SQL 中的特定日期范围内人们在不同商店购买了多少水果,我会写这样的东西

结果是这样的

您知道如何通过聚合在 Elastic 中达到相同的结果吗?

简而言之,我在弹性方面面临的问题是:

  1. 如何在聚合之前准备一个子数据(如本例中每个水果范围内的最新行)
  2. 如何按多个字段对结果进行分组

谢谢