Elasticsearch聚合中的SumIf

时间:2019-01-11 15:50:31

标签: elasticsearch elasticsearch-aggregation

我正在尝试创建一个查询,该查询根据与Excel中的SumIf相比最好的计算返回文档。

我的映射的一个非常简化的版本是:

{
  "item": {
    "properties": {
      "name": {
        "type": "text"
      },
      "data": {
        "properties": {
          "inventory": {
            "properties": {
              "locations": {
                "type": "nested",
                "properties": {
                  "state": {
                    "type": "keyword"
                  },
                  "amount": {
                    "type": "double"
                  }
                }
              },
              "total": {
                "type": "double"
              }
            }
          }
        }
      }
    }
  }
}

(此数据在实际系统中没有多大意义,但我无法发布实际映射。)

两个示例文档可能是:

{
  "name": "guitar",
  "data": {
    "inventory": {
      "locations": [
        {
          "state": "CA",
          "amount": 200
        },
        {
          "state": "AZ",
          "amount": 100
        },
        {
          "state": "NY",
          "amount": 300
        }
      ],
      "total": 600
    }
  }
}
{
  "name": "piano",
  "data": {
    "inventory": {
      "locations": [
        {
          "state": "CA",
          "amount": 200
        },
        {
          "state": "AZ",
          "amount": 100
        },
        {
          "state": "KY",
          "amount": 50
        }
      ],
      "total": 350
    }
  }
}

我希望能够返回一个查询,该查询返回“ NY”和“ CA”嵌套文档的总和大于150的文档。在示例数据的情况下,它应该返回两个文件,即使NY不在第一个文件中,因为CA本身已经是200。

我已经阅读了Elastic提供的大多数聚合文档,但是我一直找不到解决方法。

我很想知道如何解决此问题的一些指示。

1 个答案:

答案 0 :(得分:0)

我认为您不需要汇总,而是通过Script Query完成的自定义搜索查询。

不幸的是,嵌套文档的设计方式无法通过Script Query实现。

也就是说,这可能不是一个精确的解决方案,但是以下查询将返回所有具有CA和/或NY的文档,并根据{{1} } sum

这样,amount较高的文档将出现在结果的开头,其后是价值较小的文档。

查询

sum of amounts

让我知道这是否有帮助!