Skip to content

Instantly share code, notes, and snippets.

@mattweber
Last active November 9, 2019 16:30
Show Gist options
  • Save mattweber/e12f28d288c4948d2fcb93c926677388 to your computer and use it in GitHub Desktop.
Save mattweber/e12f28d288c4948d2fcb93c926677388 to your computer and use it in GitHub Desktop.
Elasticsearch 7.4.2 min/max aggregation with missing value returns invalid results
package co.webertech.search;
import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_REPLICAS;
import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_SHARDS;
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSearchResponse;
import static org.hamcrest.core.Is.is;
import org.elasticsearch.Version;
import org.elasticsearch.action.admin.cluster.node.info.NodesInfoResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.metrics.InternalMax;
import org.elasticsearch.search.aggregations.metrics.InternalMin;
import org.elasticsearch.test.ESIntegTestCase;
import org.junit.Test;
@ESIntegTestCase.ClusterScope(scope = ESIntegTestCase.Scope.SUITE)
public class MinMaxMissingIntergationTest extends ESIntegTestCase {
@Test
public void minMaxMissingTest() {
// verify we are on es 7.4.2
NodesInfoResponse info = client().admin().cluster().prepareNodesInfo().all().execute().actionGet();
info.getNodes().forEach(node -> assertTrue(node.getVersion().onOrAfter(Version.V_7_4_2)));
prepareCreate("test")
.setSettings(Settings.builder().put(SETTING_NUMBER_OF_SHARDS, 1).put(SETTING_NUMBER_OF_REPLICAS, 0).build()).get();
ensureGreen();
client().prepareIndex("test", "_doc", "1").setSource("field", new int[]{2, 3, 5}).execute().actionGet();
client().prepareIndex("test", "_doc", "2").setSource("field", new int[]{7, 1}).execute().actionGet();
client().prepareIndex("test", "_doc", "3").setSource("field", new int[]{8, 2, 5, 4}).execute().actionGet();
client().prepareIndex("test", "_doc", "4").setSource("test", "test").execute().actionGet();
ensureGreen();
refresh();
SearchRequest req = client().prepareSearch("test")
.setSize(0)
.addAggregation(AggregationBuilders.min("min_missing").field("field").missing(-1d))
.addAggregation(AggregationBuilders.max("max_missing").field("field").missing(10d))
.request();
SearchResponse resp = client().search(req).actionGet();
assertSearchResponse(resp);
assertHitCount(resp, 4);
Aggregations aggs = resp.getAggregations();
InternalMin minAgg = aggs.get("min_missing");
assertNotNull(minAgg);
assertThat(minAgg.value(), is(-1d));
InternalMax maxAgg = aggs.get("max_missing");
assertNotNull(maxAgg);
assertThat(maxAgg.value(), is(10d));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment