Elasticsearch中

时间:2015-08-04 16:20:20

标签: groovy elasticsearch

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

在我的查询中,我根据字段(" a_name")汇总它们并汇总"花费"并且"获得"。我想获得一个新的领域,即总和(支出/收益)的比率

我尝试添加脚本但是我正在获取NaN,也是为了启用它;我必须先在elasticsearch.yml文件中启用它们

script.engine.groovy.inline.aggs:on

查询

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"和"获得"

谢谢!

1 个答案:

答案 0 :(得分:4)

某些文档中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"
        }
      }
    }
  }
}