【问题标题】:Find distinct values, not distinct counts in elasticsearch在弹性搜索中查找不同的值,而不是不同的计数
【发布时间】:2015-03-27 04:53:25
【问题描述】:

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

我不想知道我有多少不同的值,但有哪些不同的值。有人知道如何实现吗?

【问题讨论】:

标签: elasticsearch distinct


【解决方案1】:

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

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

汽车术语聚合:

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

【讨论】:

  • 如何在响应中添加其他字段?
  • 如果color 字段存在于嵌套结构中,则必须在查询中进行哪些更改,如下所述|-- constituent_colors: array (nullable = true) | |-- element: struct (containsNull = true) | | |-- color: string (nullable = true) | | |-- color_code: string (nullable = true)
【解决方案2】:

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

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

【讨论】:

  • 1000 是什么意思?
  • 在聚合方面,documentation 表示:The size parameter can be set to define how many term buckets should be returned out of the overall terms list.
  • 术语聚合默认只返回 10 个桶。 “大小”指定响应所需的桶数。见elastic.co/guide/en/elasticsearch/reference/current/…
  • @NaymeshMistry 没错。我使用 size=1000 只是为了尊重原始的 OP 请求,但您可以将其删除并获取默认的 size=10 值。
  • 如果字段,在这种情况下color被分析,你需要引用keyword字段。 ES 将显示“illegal_argument_exception”错误消息“Fielddata is disabled on text fields by default...” 在这种情况下,应该说 "field": "color",,而不是 "field": "color.keyword",
【解决方案3】:

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

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

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

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

【讨论】:

    【解决方案4】:

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

    1. 打开 Kibana 的ma​​in发现工具: 并单击其添加过滤器链接以尽可能缩小搜索范围; p>

    2. 在 Kibana 的 可用字段 侧菜单中,左键单击您希望提取不同值的字段(在我的例子中,data.vulnerability.package.condition ):

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

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

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

    注意,上图我的Request中size的值是100;最初是 20,这是 Kibana 的 Number of terms 的默认设置。我在 Kibana 的 Advanced Settings 屏幕中将其更改为 100:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 1970-01-01
      相关资源
      最近更新 更多