当前位置: 首页 > 知识库问答 >
问题:

弹性搜索分析百分比

胡弘毅
2023-03-14

我正在使用Elasticsearch 1.7.3为分析报告积累数据。

我有一个保存文档的索引,其中每个文档都有一个名为“duration”(请求花费了多少毫秒)的数字字段和一个名为“component”的字符串字段。可能有许多文档具有相同的组件名称。

例如。

{"component": "A", "duration": 10}
{"component": "B", "duration": 27}
{"component": "A", "duration": 5}
{"component": "C", "duration": 2}

我想生成一份报告,说明每个组件:

此组件的所有“持续时间”字段的总和。

A: 15
B: 27
C: 2

此总数占所有文档总持续时间的百分比。在我的例子中

A: (10+5) / (10+27+5+2) * 100
B: 27 / (10+27+5+2) * 100
C: 2 / (10+27+5+2) * 100

每个组件的文档占总组件的百分比。

A: 2 / 4 * 100
B: 1 / 4 * 100
C: 1 / 4 * 100

如何使用弹性搜索 1.7.3 执行此操作?

共有2个答案

储思聪
2023-03-14

在ElasticSearch[2. x]中,您可以使用桶脚本聚合,完全满足您的需求!

如:

{
    "bucket_script": {
        "buckets_path": {
            "my_var1": "the_sum", 
            "my_var2": "the_value_count"
        },
        "script": "my_var1 / my_var2"
    }
}

细节:

POST /sales/_search
{
    "size": 0,
    "aggs" : {
        "sales_per_month" : {
            "date_histogram" : {
                "field" : "date",
                "interval" : "month"
            },
            "aggs": {
                "total_sales": {
                    "sum": {
                        "field": "price"
                    }
                },
                "t-shirts": {
                  "filter": {
                    "term": {
                      "type": "t-shirt"
                    }
                  },
                  "aggs": {
                    "sales": {
                      "sum": {
                        "field": "price"
                      }
                    }
                  }
                },
                "t-shirt-percentage": {
                    "bucket_script": {
                        "buckets_path": {
                          "tShirtSales": "t-shirts>sales",
                          "totalSales": "total_sales"
                        },
                        "script": "params.tShirtSales / params.totalSales * 100"
                    }
                }
            }
        }
    }
}
尉迟招
2023-03-14

在ES 1.7.3中,无法根据两个不同聚合的结果来计算数据,但在ES 2.0中可以通过管道聚合来完成。

但是,对于 1.7.3 的客户端,您提出的问题并不太复杂。如果您使用以下查询,您将获得获得预期数字所需的一切:

POST components/_search
{
   "size": 0,
   "aggs": {
      "total_duration": {
         "sum": {
            "field": "duration"
         }
      },
      "components": {
         "terms": {
            "field": "component"
         },
         "aggs": {
            "duration_sum": {
               "sum": {
                  "field": "duration"
               }
            }
         }
      }
   }
}

结果将如下所示:

{
   "took": 1,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 4,
      "max_score": 0,
      "hits": []
   },
   "aggregations": {
      "total_duration": {
         "value": 44
      },
      "components": {
         "doc_count_error_upper_bound": 0,
         "sum_other_doc_count": 0,
         "buckets": [
            {
               "key": "a",
               "doc_count": 2,
               "duration_sum": {
                  "value": 15
               }
            },
            {
               "key": "b",
               "doc_count": 1,
               "duration_sum": {
                  "value": 27
               }
            },
            {
               "key": "c",
               "doc_count": 1,
               "duration_sum": {
                  "value": 2
               }
            }
         ]
      }
   }
}

现在你需要做的就是以下几点。我使用的是JavaScript,但您可以用任何其他可以读取JSON的语言来实现。

var response = ...the JSON response above...
var total_duration = response.aggregations.total_duration.value;
var total_docs = response.hits.total;

response.aggregations.components.buckets.forEach(function(comp_stats) {
    // total duration for the component
    var total_duration_comp = comp_stats.duration_sum.value;

    // percentage duration of the component
    var perc_duration_comp = total_duration_comp / total_duration * 100;

    // percentage documents for the component
    var perc_doc_comp = comp_stats.doc_count / total_docs * 100;
});
 类似资料:
  • 我可以搜索正常的查询。包含来自elasticsearch uri search的字段值或排序,但无法运行uri search的术语聚合查询。 我怎么能做到这一点? 术语聚合查询是: curl-u-elastic-XGET'127.0.0.1:9200/indexname/typename/\u搜索?pretty'-d'{“size”:0,aggs:{“groupu by_field”:{“term

  • 我需要运行以下查询: 但我不能用spring data elasticsearch轻松运行这个。 有什么办法吗 spring data elasticsearch是否很好地支持所有elasticsearch查询DSL

  • 我正在尝试使用SSL上带有Elasticsearch的测微计。 我在版本1.8.0中使用测微计,在版本7.16.3和OpenJDK 11.0.2中使用Elasticsearch。 因为我知道不可能使用内置配置(链接),所以我尝试注入一个自定义的HttpUrlConnectionSender,如下面的SecureHttpSender类所示: 我注入了Spring启动,所以我可以应用所需的配置,但我得

  • 我试图修改elasticsearch中的搜索得分,方法是将_score乘以存储在每个文档中的单个值的平方根。下面是我正在使用的JSON查询。我哪里出了问题? } 提前感谢您的帮助!

  • 我的目标是搜索一个词,而不管添加了什么分析器。 我使用了匹配查询与关键字分析器,但我认为它可以与添加到该属性中的默认分析器一起工作。 在弹性搜索中,我的作者文档结构如下所示

  • 我使用Elasticsearch允许用户输入要搜索的术语。例如,我要搜索以下属性'name': 如果使用以下代码搜索或,我希望返回此文档。 我尝试过做一个bool must和做多个术语,但它似乎只有在整个字符串都匹配的情况下才起作用。 所以我真正想做的是,这个词是否以任何顺序包含两个词。 有人能帮我走上正轨吗?我已经在这上面砸了一段时间了。