From 2d64679a31297492efe38aa7a8c8ba73022bd603 Mon Sep 17 00:00:00 2001 From: Tanguy Leroux Date: Thu, 18 May 2017 18:06:44 +0200 Subject: [PATCH 1/2] Add document count to Matrix Stats aggregation response This commit adds a `doc_count` field to the response body of Matrix Stats aggregation. It exposes the number of documents involved in the computation of statistics, a value that can already be retrieved using the method MatrixStats.getDocCount() in the Java API. --- .../aggregations/matrix/stats-aggregation.asciidoc | 3 +++ .../aggregations/matrix/stats/InternalMatrixStats.java | 6 +++++- .../rest-api-spec/test/stats/30_single_value_field.yml | 4 ++++ .../rest-api-spec/test/stats/40_multi_value_field.yml | 5 +++++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/docs/reference/aggregations/matrix/stats-aggregation.asciidoc b/docs/reference/aggregations/matrix/stats-aggregation.asciidoc index 8dafb252f08bd..bb66115ecd571 100644 --- a/docs/reference/aggregations/matrix/stats-aggregation.asciidoc +++ b/docs/reference/aggregations/matrix/stats-aggregation.asciidoc @@ -37,6 +37,7 @@ the statistics. The above request returns the following response: ... "aggregations": { "matrixstats": { + "doc_count": 50, "fields": [{ "name": "income", "count": 50, @@ -73,6 +74,8 @@ the statistics. The above request returns the following response: } -------------------------------------------------- +The `doc_count` field indicates the number of documents involved in the computation of the statistics. + ==== Multi Value Fields The `matrix_stats` aggregation treats each document field as an independent sample. The `mode` parameter controls what diff --git a/modules/aggs-matrix-stats/src/main/java/org/elasticsearch/search/aggregations/matrix/stats/InternalMatrixStats.java b/modules/aggs-matrix-stats/src/main/java/org/elasticsearch/search/aggregations/matrix/stats/InternalMatrixStats.java index 5b7d2cf288d8b..95d45abedfb48 100644 --- a/modules/aggs-matrix-stats/src/main/java/org/elasticsearch/search/aggregations/matrix/stats/InternalMatrixStats.java +++ b/modules/aggs-matrix-stats/src/main/java/org/elasticsearch/search/aggregations/matrix/stats/InternalMatrixStats.java @@ -73,6 +73,9 @@ public String getWriteableName() { /** get the number of documents */ @Override public long getDocCount() { + if (stats == null) { + return 0; + } return stats.docCount; } @@ -157,7 +160,8 @@ static class Fields { @Override public XContentBuilder doXContentBody(XContentBuilder builder, Params params) throws IOException { - if (results != null && results.getFieldCounts().keySet().isEmpty() == false) { + builder.field(CommonFields.DOC_COUNT.getPreferredName(), getDocCount()); + if (results != null) { builder.startArray(Fields.FIELDS); for (String fieldName : results.getFieldCounts().keySet()) { builder.startObject(); diff --git a/modules/aggs-matrix-stats/src/test/resources/rest-api-spec/test/stats/30_single_value_field.yml b/modules/aggs-matrix-stats/src/test/resources/rest-api-spec/test/stats/30_single_value_field.yml index 13b08a789da66..f5ad9c974005b 100644 --- a/modules/aggs-matrix-stats/src/test/resources/rest-api-spec/test/stats/30_single_value_field.yml +++ b/modules/aggs-matrix-stats/src/test/resources/rest-api-spec/test/stats/30_single_value_field.yml @@ -133,6 +133,7 @@ setup: body: {"aggs": { "mfs" : { "matrix_stats": {"fields": ["val1", "val2", "val3"]} } } } - match: {hits.total: 0} + - match: {aggregations.mfs.doc_count: 0} --- "Single value field": @@ -144,6 +145,7 @@ setup: body: {"aggs": { "mfs" : { "matrix_stats": {"fields": ["val1", "val3"]} } } } - match: {hits.total: 15} + - match: {aggregations.mfs.doc_count: 15} - match: {aggregations.mfs.fields.0.count: 15} --- @@ -156,6 +158,7 @@ setup: body: {"aggs": { "mfs" : { "matrix_stats": {"fields": ["val1", "val2", "val3"]} } } } - match: {hits.total: 15} + - match: {aggregations.mfs.doc_count: 14} - match: {aggregations.mfs.fields.0.count: 14} - match: {aggregations.mfs.fields.2.correlation.val2: 0.9569513137793205} @@ -169,6 +172,7 @@ setup: body: {"aggs": { "mfs" : { "matrix_stats": {"fields": ["val1", "val2", "val3"], "missing" : {"val2" : 10} } } } } - match: {hits.total: 15} + - match: {aggregations.mfs.doc_count: 15} - match: {aggregations.mfs.fields.0.count: 15} - match: {aggregations.mfs.fields.2.correlation.val2: 0.9567970467908384} diff --git a/modules/aggs-matrix-stats/src/test/resources/rest-api-spec/test/stats/40_multi_value_field.yml b/modules/aggs-matrix-stats/src/test/resources/rest-api-spec/test/stats/40_multi_value_field.yml index 1803238ecc360..87b30400c836d 100644 --- a/modules/aggs-matrix-stats/src/test/resources/rest-api-spec/test/stats/40_multi_value_field.yml +++ b/modules/aggs-matrix-stats/src/test/resources/rest-api-spec/test/stats/40_multi_value_field.yml @@ -133,6 +133,7 @@ setup: body: {"aggs": { "mfs" : { "matrix_stats": {"fields": ["val1", "val2", "vals"]} } } } - match: {hits.total: 0} + - match: {aggregations.mfs.doc_count: 0} --- "Multi value field Max": @@ -144,6 +145,7 @@ setup: body: {"aggs": { "mfs" : { "matrix_stats": {"fields": ["val1", "vals"], "mode" : "max"} } } } - match: {hits.total: 15} + - match: {aggregations.mfs.doc_count: 14} - match: {aggregations.mfs.fields.0.count: 14} - match: {aggregations.mfs.fields.0.correlation.val1: 0.06838646533369998} @@ -157,6 +159,7 @@ setup: body: {"aggs": { "mfs" : { "matrix_stats": {"fields": ["val1", "vals"], "mode" : "min"} } } } - match: {hits.total: 15} + - match: {aggregations.mfs.doc_count: 14} - match: {aggregations.mfs.fields.0.count: 14} - match: {aggregations.mfs.fields.0.correlation.val1: -0.09777682707831963} @@ -170,6 +173,7 @@ setup: body: {"aggs": { "mfs" : { "matrix_stats": {"fields": ["val1", "val2", "vals"]} } } } - match: {hits.total: 15} + - match: {aggregations.mfs.doc_count: 13} - match: {aggregations.mfs.fields.0.count: 13} - match: {aggregations.mfs.fields.0.correlation.val1: -0.044997535185684244} @@ -183,6 +187,7 @@ setup: body: {"aggs": { "mfs" : { "matrix_stats": {"fields": ["val1", "val2", "vals"], "missing" : {"val2" : 10, "vals" : 5 } } } } } - match: {hits.total: 15} + - match: {aggregations.mfs.doc_count: 15} - match: {aggregations.mfs.fields.0.count: 15} - match: {aggregations.mfs.fields.0.correlation.val2: 0.04028024709708195} From 08df6c21d3a6aa489ca77e7a01841df67d7d8366 Mon Sep 17 00:00:00 2001 From: Tanguy Leroux Date: Fri, 19 May 2017 10:57:41 +0200 Subject: [PATCH 2/2] revert if change in toXContent() method --- .../search/aggregations/matrix/stats/InternalMatrixStats.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/aggs-matrix-stats/src/main/java/org/elasticsearch/search/aggregations/matrix/stats/InternalMatrixStats.java b/modules/aggs-matrix-stats/src/main/java/org/elasticsearch/search/aggregations/matrix/stats/InternalMatrixStats.java index 95d45abedfb48..b5091c43302f1 100644 --- a/modules/aggs-matrix-stats/src/main/java/org/elasticsearch/search/aggregations/matrix/stats/InternalMatrixStats.java +++ b/modules/aggs-matrix-stats/src/main/java/org/elasticsearch/search/aggregations/matrix/stats/InternalMatrixStats.java @@ -161,7 +161,7 @@ static class Fields { @Override public XContentBuilder doXContentBody(XContentBuilder builder, Params params) throws IOException { builder.field(CommonFields.DOC_COUNT.getPreferredName(), getDocCount()); - if (results != null) { + if (results != null && results.getFieldCounts().keySet().isEmpty() == false) { builder.startArray(Fields.FIELDS); for (String fieldName : results.getFieldCounts().keySet()) { builder.startObject();