在 elasticsearch 中查找不同的值,而不是不同的计数

Find distinct values, not distinct counts in elasticsearch

Elasticsearch documentation 建议* 他们的代码

*文档修复

GET /cars/transactions/_search?search_type=count
{
  "aggs": {
    "distinct_colors": {
      "cardinality": {
        "field": "color"
      }
    }
  }
}

对应sql查询

SELECT DISTINCT(color) FROM cars

但实际上对应的是

SELECT COUNT(DISTINCT(color)) FROM cars

我不想知道我有多少个不同的值,但我不想知道这些不同的值是什么。有人知道如何实现吗?

color 字段中使用 terms aggregation。并且您需要注意如何分析您希望获得不同值的字段,这意味着您需要确保在索引时没有对其进行标记化,否则聚合中的每个条目都将是一个不同的术语,它是字段内容。

如果您仍然想要标记化并使用 terms 聚合,您可能需要查看该字段的 not_analyzed 类型的索引,并可能使用 multi fields.

汽车术语汇总:

GET /cars/transactions/_search?search_type=count
{
  "aggs": {
    "distinct_colors": {
      "terms": {
        "field": "color",
        "size": 1000
      }
    }
  }
}

为了更新 Andrei Stefan 的优秀答案,我们需要说明查询参数 search_type=count 在 Elasticsearch 5 中不再受支持。执行此操作的新方法是在中添加 "size" : 0正文如:

GET /cars/transactions/_search
{
  "size": 0,
  "aggs": {
    "distinct_colors": {
      "terms": {
        "field": "color",
        "size": 1000
      }
    }
  }
}

就个人而言,当我想添加多个过滤器时,这两个答案对我来说都是神秘莫测的复杂。

对我来说,有意义的是进入“发现”选项卡并应用我想要的过滤器。然后我保存了我的搜索。

然后,我使用保存的搜索创建了一个新的条形图可视化。然后我修改了 X 轴以根据我感兴趣的领域(在我的例子中是用户名)使用术语聚合,然后按计数排序。确保尺寸较大,例如 500。

您应该能够在图表下方以表格形式获得结果。简单,没有复杂的 JSON 编程。只需一系列点击。您甚至可以保存可视化以供日后使用。

虽然我很欣赏利用 Kibana 来回答这个问题的想法,但我无法完全按照 described by @Phlucious 的方式完成它。以下是我的处理方式(Kibana 和 Elasticsearch 7.8.1):

  1. 打开 Kibana 的 main Discover 工具: 并单击其 Add filter link 尽可能缩小搜索范围;

  2. 在 Kibana 的 可用字段 side-menu,left-click 在您希望提取不同值的字段上(在我的例子中, data.vulnerability.package.condition):

  3. 这将打开一个菜单,其中包含该字段的前 5 个值,然后是标有 Visualize 的按钮。单击 Visualize 以打开您所在领域最高值的可视化:

  4. Left-click 此图表上方的 Inspect link。 sub-screen 打开,您可以在其中查看所选字段的最高值:

  5. 在此 sub-screen 的上 right-hand 角找到一个标有 View: Data 的 link。 Left-click 它改为选择 Requests。在出现的新 sub-screen 的 header 中,您可以单击 Request 以访问用于生成图形和图表的 Elasticsearch 查询 Kibana:

请注意,如上图所示,我的请求中 size 的值为 100;最初它是 20,这是 Kibana 的默认设置术语数。我在 Kibana 的 高级设置 屏幕中将其更改为 100: