groovy - Elasticsearch中两个字段的划分

标签 groovy elasticsearch

目前,我正在尝试根据一个字段对一个字段进行分组,而不是根据用于分组的相应字段获取其他字段的总和。我想获得一个新值,该值需要除以求和字段。我将提供我当前的查询:

在我的查询中,我根据字段(“a_name”)聚合它们并对“支出”和“ yield ”求和。我想要一个新字段,它是总和(支出/ yield )的比率

我尝试添加脚本,但我得到 NaN ,也是为了启用此功能;我必须首先在 elasticsearch.yml 文件中启用它们

script.engine.groovy.inline.aggs:打开

查询

GET /index1/table1/_search
{
  "size": 0,
  "query": {
    "filtered": {
      "query": {
        "query_string": {
          "query": "*",
          "analyze_wildcard": true
        }
      },
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "account_id": 29
              }
            }
          ],
          "must_not": []
        }
      }
    }
  },
  "aggs": {
    "custom_name": {
      "terms": {
        "field": "a_name"
      },
      "aggs": {
        "spe": {
          "sum": {
            "field": "spend"
          }
        },
        "gained": {
          "sum": {
            "field": "gain"
          }
        },
        "rati": {
          "sum": {
            "script": "doc['spend'].value/doc['gain'].value"
          }
        }
      }
    }
  }
}

这个特定的查询在输出中向我显示“NaN”。如果我将除法替换为乘法,则查询有效。

本质上我正在寻找的是划分我的两个聚合器“spe”和“gained”

谢谢!

最佳答案

您的某些文档中的 doc.gain 可能为 0。您可以尝试将脚本更改为:

"script": "doc['gain'].value != 0 ? doc['spend'].value / doc['gain'].value : 0"

更新

如果您想计算其他两个指标聚合结果的比率,可以使用 bucket_script 来实现。聚合(不过仅在 ES 2.0 中可用)。

{
  ...
  "aggs": {
    "custom_name": {
      "terms": {
        "field": "a_name"
      },
      "aggs": {
        "spe": {
          "sum": {
            "field": "spend"
          }
        },
        "gained": {
          "sum": {
            "field": "gain"
          }
        },
        "bucket_script": {
          "buckets_paths": {
            "totalSpent": "spe",
            "totalGained": "gained"
          },
          "script": "totalSpent / totalGained"
        }
      }
    }
  }
}

关于groovy - Elasticsearch中两个字段的划分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31814402/

相关文章:

java - Maven Surefire 不执行测试阶段

java - 设置 Titan 和 Cassandra - 无法实例化存储管理器类

hibernate - 使用不同的别名多次加入关联

java - 错误 : mongodb. jdbc.MongoDriver 未加载。您确定已在 :jdbc_driver_library? 中包含正确的 jdbc 驱动程序吗

elasticsearch - elasticsearch范围和项过滤器

java - 如何阻止 JsonBuilder 排列字段顺序

groovy - Groovy 幂运算符 (**) 的结合性是否被破坏?

date - 如何阻止在错误的年份自动创建Elasticsearch索引

java - Java连接池关闭

elasticsearch - 如何将我的 Elastic Search 服务器暴露在互联网上?