查找不同的值,而不是弹性搜索中的不同计数

时间:2015-01-28 10:21:49

标签: elasticsearch distinct

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

我不想知道我有多少不同的值,但有什么不同的值。任何人都知道如何实现这一目标?

4 个答案:

答案 0 :(得分:30)

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

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

汽车条款汇总:

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

答案 1 :(得分:22)

要更新Andrei Stefan的优秀答案,我们需要说Elasticsearch 5不再支持查询参数search_type=count。这样做的新方法是在正文中添加"size" : 0如:

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

答案 2 :(得分:1)

就我个人而言,这两个答案对我来说都是莫名其妙的,当我想添加多个过滤器时,这是毫无希望的。

对我来说,有意义的是转到“发现”选项卡并应用所需的过滤器。然后,我保存了搜索。

然后,我使用保存的搜索创建了新的条形图可视化。然后,我修改了X轴以根据感兴趣的字段(在我的情况下为用户名)使用术语汇总,然后按计数排序。确保大小较大,例如500。

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

答案 3 :(得分:0)

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

  1. 打开Kibana的 发现工具:main Kibana Discover menu location,然后单击其添加过滤器链接以缩小搜索范围尽可能;

  2. 在Kibana的可用字段侧面菜单中,左键单击要提取不同值的字段(在我的示例中为 data.vulnerability.package.condition < / em>):Kibana Available fields menu

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

  4. 左键单击此图表上方的检查链接。将打开一个子屏幕,您可以在其中查看所选字段的最高值:sub-screen

  5. 在此子屏幕的右上角,找到一个标记为 View:Data 的链接。左键单击以选择 Requests 。在出现的新子屏幕的标题中,您可以单击请求以访问用于生成图形和图表的Elasticsearch查询Kibana:requests

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