【问题标题】:SumIf in in Elasticsearch aggregationSumIf 在 Elasticsearch 聚合中
【发布时间】:2019-01-13 02:57:51
【问题描述】:

我正在尝试创建一个查询,该查询基于与 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 提供的大部分聚合文档,但我一直无法找到这样做的方法。

我很想得到一些关于如何解决这个问题的建议。

【问题讨论】:

    标签: elasticsearch elasticsearch-aggregation


    【解决方案1】:

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

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

    也就是说,这可能不是一个精确的解决方案,但下面的查询将返回所有具有CA 和/或NY 的文档,并将根据sumamount 对它们进行排序.

    这样,具有较高 sum of amounts 的文档将出现在结果的开头,然后是价值较低的文档。

    查询

    POST <your_index_name>/_search
    {
      "query": {
        "bool": {
          "should": [
            {
              "nested": {
                "path": "data.inventory.locations",
                "query": {
                  "match": {
                    "data.inventory.locations.state": "CA"
                  }
                }
              }
            },
            {
              "nested": {
                "path": "data.inventory.locations",
                "query": {
                  "match": {
                    "data.inventory.locations.state": "NY"
                  }
                }
              }
    
            }
          ]
        }
      },
      "sort": [
        {
          "data.inventory.locations.amount": {
            "order": "desc",
            "mode": "sum",
            "nested_path": "data.inventory.locations",
            "nested_filter": {
              "terms": {
                "data.inventory.locations.state": ["CA","NY"]
              }
            }
          }
        }
      ]
    }
    

    如果这有帮助,请告诉我!

    【讨论】:

    • 嗨@Kamal,很抱歉回复晚了。不幸的是,直到现在我都无法解决这个问题。我已经在我的真实数据中实现了您的解决方案,它完全按照您的描述进行。不幸的是,我需要按日期对结果进行排序(不在描述中),所以我仍然需要找到一些方法来根据该总和过滤结果。我还需要在这些过滤数据之上进行聚合。我想我必须深入研究 Elastic 文档,看看我是否真的能找到合适的解决方案。我的帖子可以为正确的方向提供有用的推动。
    • 嘿@StephanJanssen,这很好。我希望你能得到你的解决方案,但如果你需要任何帮助,请告诉我。祝你好运:)
    猜你喜欢
    • 2017-09-24
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2020-01-17
    • 2022-01-25
    相关资源
    最近更新 更多