如何在ElasticSearch中的聚合字段上执行复杂查询

达鲁什

我试图弄清楚如何在弹性搜索中执行复杂的查询,可以说我有以下数据表:

在此处输入图片说明

我从以下查询中得到的

{
  "aggs": {
    "3": {
      "terms": {
        "field": "ColumnA",
        "order": {
          "_key": "desc"
        },
        "size": 50
      },
      "aggs": {
        "4": {
          "terms": {
            "field": "ColumnB",
            "order": {
              "_key": "desc"
            },
            "size": 50
          },
          "aggs": {
            "5": {
              "terms": {
                "field": "ColumnC",
                "order": {
                  "_key": "desc"
                },
                "size": 50
              },
              "aggs": {
                "sum_of_views": {
                  "sum": {
                    "field": "views"
                  }
                },
                "sum_of_costs": {
                  "sum": {
                    "field": "cost"
                  }
                },
                "sum_of_clicks": {
                  "sum": {
                    "field": "clicks"
                  }
                },
                "sum_of_earned": {
                  "sum": {
                    "field": "earned"
                  }
                },
                "sum_of_adv_earned": {
                  "sum": {
                    "field": "adv_earned"
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "size": 0,
  "_source": {
    "excludes": []
  },
  "stored_fields": [
    "*"
  ],
  "script_fields": {},
  "docvalue_fields": [
    {
      "field": "hour",
      "format": "date_time"
    }
  ],
  "query": {
    "bool": {
      "must": [],
      "filter": [
        {
          "match_all": {}
        },
        {
          "range": {
            "hour": {
              "format": "strict_date_optional_time",
              "gte": "2019-08-08T06:29:34.723Z",
              "lte": "2020-08-08T06:29:34.724Z"
            }
          }
        }
      ],
      "should": [],
      "must_not": []
    }
  }
}

现在,例如,如果我想获取具有以下条件的记录

(sum_of_clicks / sum_of_views) * (sum_of_earned2 / sum_of_earned1) < 0.5

我应该查询什么?

Opster ES Ninja-Kamal

认为以下内容应有所帮助。我的理解是,您希望首先基于进行分组ColumnA, ColumnB, ColumnC,计算clicks, views, earned1 and earned2字段的总和,然后应用所需的自定义聚合逻辑。

我已经能够提出以下查询,其中我使用了Bucket Selector Aggregation

POST <your_index_name>/_search
{
  "size": 0, 
  "aggs": {
    "3": {
      "terms": {
        "field": "ColumnA",
        "order": {
          "_key": "desc"
        },
        "size": 50
      },
      "aggs": {
        "4": {
          "terms": {
            "field": "ColumnB",
            "order": {
              "_key": "desc"
            },
            "size": 50
          },
          "aggs": {
            "5": {
              "terms": {
                "field": "ColumnC",
                "order": {
                  "_key": "desc"
                },
                "size": 50
              },
              "aggs": {
                "sum_views": {
                  "sum": {
                    "field": "views"
                  }
                },
                "sum_clicks": {
                  "sum": {
                    "field": "clicks"
                  }
                },
                "sum_earned1": {
                  "sum": {
                    "field": "earned1"
                  }
                },
                "sum_earned2": {
                  "sum": {
                    "field": "earned2"
                  }
                },
                "custom_sum_bucket_filter": {
                  "bucket_selector": {
                    "buckets_path": {
                      "sum_of_views": "sum_views",
                      "sum_of_clicks": "sum_clicks",
                      "sum_of_earned1": "sum_earned1",
                      "sum_of_earned2": "sum_earned2"
                    },
                    "script": "(params.sum_of_views/params.sum_of_clicks) * (params.sum_of_earned1/params.sum_of_earned2) < 0.5"
                  }
                }
              }
            },
            "min_bucket_selector": {
              "bucket_selector": {
                "buckets_path": {
                  "valid_docs_count": "5._bucket_count"
                },
                "script": {
                  "source": "params.valid_docs_count >= 1"
                }
              }
            }
          }
        },
        "min_bucket_selector": {
          "bucket_selector": {
            "buckets_path": {
              "valid_docs_count": "4._bucket_count"
            },
            "script": {
              "source": "params.valid_docs_count >= 1"
            }
          }
        }
      }
    }
  }
}

请注意,要得到确切的结果,您正在寻找,我不得不在增加桶的过滤条件45

我使用的聚合是

  • 铲斗选择器以计算您提到的条件
  • 再次选择存储桶选择器,以便在聚合5时不显示空存储桶
  • 再次选择一个存储桶选择器,以便现在显示第4级的空存储桶聚合。

为了测试为什么我添加了其他空桶式过滤器,您可以将其删除并查看观察到的结果。

请注意,为简单起见,我忽略了query零件和cost字段。请随时添加它们并进行测试。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Cypher:如何在同一查询中执行COUNT和MAX / MIN(相同的聚合)

来自分类Dev

ElasticSearch:_score字段上的聚合?

来自分类Dev

如何在Accumulo中的列限定符字段上执行聚合?

来自分类Dev

如何在Elasticsearch中对多值字段进行桶聚合

来自分类Dev

如何在Elasticsearch中的分析字段上执行完全匹配查询?

来自分类Dev

如何在elasticsearch的嵌套聚合中存储空字段和非空字段?

来自分类Dev

如何在包含聚合或子查询的表达式上执行聚合函数?

来自分类Dev

如何在较少的SQL查询中执行复杂的API授权?

来自分类Dev

如何在不同的嵌套对象上使用术语和总和查询Elasticsearch聚合?

来自分类Dev

在Elasticsearch中验证聚合查询

来自分类Dev

Elasticsearch中的复杂查询

来自分类Dev

如何在Elasticsearch中的对象列表上执行聚合(例如,avg)?

来自分类Dev

如何在Elasticsearch的子聚合中访问date_histogram键字段?

来自分类Dev

ELASTICSEARCH-如何在布尔字段中获得聚合?

来自分类Dev

如何在Django中执行查询多对多字段?

来自分类Dev

如何在elasticsearch中执行不等于0的查询字段

来自分类Dev

如何在猫鼬中的选定字段上执行搜索

来自分类Dev

如何在Elasticsearch中的原始字段上聚合?原始字段似乎没有填充

来自分类Dev

如何在没有嵌套查询的情况下在MySQL中执行组聚合?

来自分类Dev

是否可以在父聚合定义的字段上执行Elasticsearch嵌套统计聚合?

来自分类Dev

如何在Marvel 2.0插件中执行Elasticsearch查询?

来自分类Dev

如何在Java中编写Elasticsearch查询聚合?

来自分类Dev

Elasticsearch中的复杂布尔查询

来自分类Dev

如何在Elasticsearch 5.1中检索字段以及聚合函数(使用curl)?

来自分类Dev

如何在 postgresql 中编写复杂的查询

来自分类Dev

如何在 GROUP BY 查询中聚合非聚合值?

来自分类Dev

如何在 Elasticsearch 中执行非重复计数查询

来自分类Dev

Elasticsearch - 针对聚合的查询字段

来自分类Dev

如何在elasticsearch中聚合“非关键字”字段?

Related 相关文章

  1. 1

    Cypher:如何在同一查询中执行COUNT和MAX / MIN(相同的聚合)

  2. 2

    ElasticSearch:_score字段上的聚合?

  3. 3

    如何在Accumulo中的列限定符字段上执行聚合?

  4. 4

    如何在Elasticsearch中对多值字段进行桶聚合

  5. 5

    如何在Elasticsearch中的分析字段上执行完全匹配查询?

  6. 6

    如何在elasticsearch的嵌套聚合中存储空字段和非空字段?

  7. 7

    如何在包含聚合或子查询的表达式上执行聚合函数?

  8. 8

    如何在较少的SQL查询中执行复杂的API授权?

  9. 9

    如何在不同的嵌套对象上使用术语和总和查询Elasticsearch聚合?

  10. 10

    在Elasticsearch中验证聚合查询

  11. 11

    Elasticsearch中的复杂查询

  12. 12

    如何在Elasticsearch中的对象列表上执行聚合(例如,avg)?

  13. 13

    如何在Elasticsearch的子聚合中访问date_histogram键字段?

  14. 14

    ELASTICSEARCH-如何在布尔字段中获得聚合?

  15. 15

    如何在Django中执行查询多对多字段?

  16. 16

    如何在elasticsearch中执行不等于0的查询字段

  17. 17

    如何在猫鼬中的选定字段上执行搜索

  18. 18

    如何在Elasticsearch中的原始字段上聚合?原始字段似乎没有填充

  19. 19

    如何在没有嵌套查询的情况下在MySQL中执行组聚合?

  20. 20

    是否可以在父聚合定义的字段上执行Elasticsearch嵌套统计聚合?

  21. 21

    如何在Marvel 2.0插件中执行Elasticsearch查询?

  22. 22

    如何在Java中编写Elasticsearch查询聚合?

  23. 23

    Elasticsearch中的复杂布尔查询

  24. 24

    如何在Elasticsearch 5.1中检索字段以及聚合函数(使用curl)?

  25. 25

    如何在 postgresql 中编写复杂的查询

  26. 26

    如何在 GROUP BY 查询中聚合非聚合值?

  27. 27

    如何在 Elasticsearch 中执行非重复计数查询

  28. 28

    Elasticsearch - 针对聚合的查询字段

  29. 29

    如何在elasticsearch中聚合“非关键字”字段?

热门标签

归档