Elasticsearch: Unable to use WeightedAvg aggregation with Rest High Level Client

Created on 11 Dec 2018  路  5Comments  路  Source: elastic/elasticsearch

Elasticsearch version (bin/elasticsearch --version):
6.5.2

Plugins installed:
N/A

JVM version (java -version):
1.8.0_172

OS version (uname -a if on a Unix-like system):
Linux 4.15.0-34-generic #37-Ubuntu SMP Mon Aug 27 15:21:48 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

Description of the problem including expected versus actual behavior:
Adding a weighted_avg aggregation to a search source results in an exception when marshalling the source:
com.fasterxml.jackson.core.JsonGenerationException: Can not write a field name, expecting a value

Steps to reproduce:

A minimal test case (based on the example weighted_avg usage in the documentation) for this is as follows:

import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.support.MultiValuesSourceFieldConfig;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.json.JSONException;
import org.junit.jupiter.api.Test;
import org.skyscreamer.jsonassert.JSONAssert;
import org.skyscreamer.jsonassert.JSONCompareMode;

public class TestCase {
    @Test
    public void weightedAverageSerialization() throws JSONException {
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
                .size(0)
                .aggregation(
                        AggregationBuilders.weightedAvg("weighted_grade")
                                .value(new MultiValuesSourceFieldConfig.Builder()
                                        .setFieldName("grade")
                                        .build())
                                .weight(new MultiValuesSourceFieldConfig.Builder()
                                        .setFieldName("weight")
                                        .build())
                );

        String actualStr = sourceBuilder.toString();
        JSONAssert.assertEquals("{\n" +
                "  \"size\": 0,\n" +
                "  \"aggregations\" : {\n" +
                "    \"weighted_grade\": {\n" +
                "      \"weighted_avg\": {\n" +
                "        \"value\": {\n" +
                "          \"field\": \"grade\"\n" +
                "        },\n" +
                "        \"weight\": {\n" +
                "          \"field\": \"weight\"\n" +
                "        }\n" +
                "      }\n" +
                "    }\n" +
                "  }\n" +
                "}", actualStr, JSONCompareMode.LENIENT);
    }
}

Provide logs (if relevant):

ElasticsearchException[com.fasterxml.jackson.core.JsonGenerationException: Can not write a field name, expecting a value
]; nested: JsonGenerationException[Can not write a field name, expecting a value];
    at org.elasticsearch.search.builder.SearchSourceBuilder.toString(SearchSourceBuilder.java:1565)
    at org.elasticsearch.search.builder.SearchSourceBuilder.toString(SearchSourceBuilder.java:1558)
    at TestCase.weightedAverageSerialization(TestCase.java:24)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:515)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:171)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:167)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:114)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:59)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:105)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:95)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:71)
    at java.util.ArrayList.forEach(ArrayList.java:1257)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:110)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:95)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:71)
    at java.util.ArrayList.forEach(ArrayList.java:1257)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:110)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:95)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:71)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:220)
    at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:188)
    at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:202)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:181)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
    at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:74)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: com.fasterxml.jackson.core.JsonGenerationException: Can not write a field name, expecting a value
    at com.fasterxml.jackson.core.JsonGenerator._reportError(JsonGenerator.java:1961)
    at com.fasterxml.jackson.core.json.UTF8JsonGenerator.writeFieldName(UTF8JsonGenerator.java:188)
    at com.fasterxml.jackson.core.json.JsonGeneratorImpl.writeStringField(JsonGeneratorImpl.java:202)
    at org.elasticsearch.common.xcontent.json.JsonXContentGenerator.writeStringField(JsonXContentGenerator.java:276)
    at org.elasticsearch.common.xcontent.XContentBuilder.field(XContentBuilder.java:636)
    at org.elasticsearch.search.aggregations.support.MultiValuesSourceFieldConfig.toXContent(MultiValuesSourceFieldConfig.java:120)
    at org.elasticsearch.common.xcontent.XContentBuilder.value(XContentBuilder.java:857)
    at org.elasticsearch.common.xcontent.XContentBuilder.value(XContentBuilder.java:850)
    at org.elasticsearch.common.xcontent.XContentBuilder.unknownValue(XContentBuilder.java:828)
    at org.elasticsearch.common.xcontent.XContentBuilder.map(XContentBuilder.java:888)
    at org.elasticsearch.common.xcontent.XContentBuilder.unknownValue(XContentBuilder.java:822)
    at org.elasticsearch.common.xcontent.XContentBuilder.value(XContentBuilder.java:804)
    at org.elasticsearch.common.xcontent.XContentBuilder.field(XContentBuilder.java:789)
    at org.elasticsearch.search.aggregations.support.MultiValuesSourceAggregationBuilder.internalXContent(MultiValuesSourceAggregationBuilder.java:228)
    at org.elasticsearch.search.aggregations.AbstractAggregationBuilder.toXContent(AbstractAggregationBuilder.java:154)
    at org.elasticsearch.search.aggregations.AggregatorFactories$Builder.toXContent(AggregatorFactories.java:448)
    at org.elasticsearch.common.xcontent.XContentBuilder.value(XContentBuilder.java:857)
    at org.elasticsearch.common.xcontent.XContentBuilder.value(XContentBuilder.java:850)
    at org.elasticsearch.common.xcontent.XContentBuilder.field(XContentBuilder.java:842)
    at org.elasticsearch.search.builder.SearchSourceBuilder.innerToXContent(SearchSourceBuilder.java:1269)
    at org.elasticsearch.search.builder.SearchSourceBuilder.toXContent(SearchSourceBuilder.java:1309)
    at org.elasticsearch.common.xcontent.XContentHelper.toXContent(XContentHelper.java:349)
    at org.elasticsearch.search.builder.SearchSourceBuilder.toString(SearchSourceBuilder.java:1563)
    ... 41 more
    Suppressed: java.lang.IllegalStateException: Failed to close the XContentBuilder
        at org.elasticsearch.common.xcontent.XContentBuilder.close(XContentBuilder.java:1002)
        at org.elasticsearch.common.xcontent.XContentHelper.toXContent(XContentHelper.java:344)
        ... 42 more
    Caused by: java.io.IOException: Unclosed object or array found
        at org.elasticsearch.common.xcontent.json.JsonXContentGenerator.close(JsonXContentGenerator.java:469)
        at org.elasticsearch.common.xcontent.XContentBuilder.close(XContentBuilder.java:1000)
        ... 43 more
:AnalyticAggregations >bug

Most helpful comment

@tke thanks for the report. Fix for this was pushed and should be made available in the versions tagged on the Pull Request. Hope all is resolved for you after upgrading when they are made available!

All 5 comments

Pinging @elastic/es-core-features

Can still reproduce it on master.

Pinging @elastic/es-analytics-geo

Nice turnaround time! :+1:

@tke thanks for the report. Fix for this was pushed and should be made available in the versions tagged on the Pull Request. Hope all is resolved for you after upgrading when they are made available!

Was this page helpful?
0 / 5 - 0 ratings