【问题标题】:Dividing counts of two different queries in kibana在kibana中划分两个不同查询的计数
【发布时间】:2017-09-29 09:08:57
【问题描述】:

我正在尝试创建一个 lucene 表达式来显示两个查询计数的除法。两个查询都包含文本信息,并且两个结果都在消息字段中。我不知道如何正确地写这个。到目前为止,我所做的一切都没有运气-

doc['message'].value/doc['message'].value

对于第一个查询 message 包含文本为 - "404 not found"

对于第二个查询 message 包含文本为 - "500 error"

我想做的是count(404 not found)/count(500 error)

我将不胜感激。

【问题讨论】:

  • 我想我可以帮助你,我只是想确保我正确理解了这个问题:你需要一个计算,即包含完全“404 not found”的不同文档的数量除以数量包含完全“500 错误”输出为浮点数的不同文档?假设是,您是否将消息字段映射为“关键字”类型?如果不是,我需要对您想要的输出进行更多说明。
  • @MikeMichaels 是的,你在我想要的输出上是对的,消息字段也被映射为“关键字”类型

标签: elasticsearch lucene kibana


【解决方案1】:

我将添加免责声明,即只运行两个单独的计数并在客户端执行计算,如下所示:

GET /INDEX/_search
{
  "size": 0, 
  "aggs": {
    "types": {
      "terms": {
        "field": "type",
        "size": 10
      }
    }
  }
}

这会返回类似的东西(除了在我的示例中使用不同的键而不是类型):

  "aggregations": {
    "types": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "Article",
          "doc_count": 881
        },
        {
          "key": "Page",
          "doc_count": 301
        }
      ]
    }

使用它,进行不同的计数并计算平均值。

如上所述,这是我从(通过单个请求)this 整理出来的 hacky 方式

GET /INDEX/_search
{
  "size": 0,
  "aggs": {
    "parent_agg": {
      "terms": {
        "script": "'This approach is a weird hack'"
      },
      "aggs": {
        "four_oh_fours": {
          "filter": {
            "term": {
              "message": "404 not found"
            }
          },
          "aggs": {
            "count": {
              "value_count": {
                "field": "_index"
              }
            }
          }
        },
        "five_hundreds": {
          "filter": {
            "term": {
              "message": "500 error"
            }
          },
          "aggs": {
            "count": {
              "value_count": {
                "field": "_index"
              }
            }
          }
        },
        "404s_over_500s": {
          "bucket_script": {
            "buckets_path": {
              "four_oh_fours": "four_oh_fours.count",
              "five_hundreds": "five_hundreds.count"
            },
            "script": "return params.four_oh_fours / (params.five_hundreds == 0 ? 1: params.five_hundreds)"
          }
        }
      }
    }
  }
}

这应该根据脚本中的计算返回一个聚合值。

如果有人可以提供这两种方法之外的方法,我很乐意看到它。希望这会有所帮助。

编辑 - 通过“表达式”类型而不是无痛(默认)完成的相同脚本。只需将上面的脚本值替换为以下内容:

        "script": {
          "inline": "four_oh_fours / (five_hundreds == 0 ? 1 : five_hundreds)",
          "lang": "expression"
        }

在这里更新了脚本以通过 Lucene 表达式完成同样的事情

【讨论】:

  • 感谢您的建议,但我想知道这是否可以使用 lucene 表达式完成?我对脚本非常陌生,希望有其他更简单的方法可以做到这一点。
  • 明白。只是想知道,您是否有任何特殊原因希望将其编写为 lucene 表达式与无痛脚本(如我的示例)?
  • 我们正在开发一个由某人拥有的集群,他们不想启用无痛脚本。除了那个 lucene 表达式对我来说似乎更容易。
  • 有机会我看看能不能用 lucene 表达式给你同样的输出
  • @johny 似乎通过表达式比我想象的更容易,只需要弄清楚参数语法(这似乎比其他脚本方法更直观)。
猜你喜欢
  • 1970-01-01
  • 2015-06-22
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多