Библиотека ElasticSearch в Java не может найти метод AggregationBuilders.sum - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь использовать API AggregationBuilders для ElasticSearch в java, чтобы найти суммы агрегаций. Но при использовании сервиса, использующего этот метод (AggregationBuilders.sum ()), выдается следующая ошибка: java.lang.NoSuchMethodError:org.elasticsearch.search.aggregations.AggregationBuilders.sum(Ljava/lang/String;)Lorg/elasticsearch/search/aggregations/metrics/SumAggregationBuilder;

Это мой файл pom.xml

    <dependencies>
        <!-- Elasticsearch dependencies -->
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.2.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-high-level-client -->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.2.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.elasticsearch.plugin/transport-netty4-client -->
        <dependency>
            <groupId>org.elasticsearch.plugin</groupId>
            <artifactId>transport-netty4-client</artifactId>
            <version>7.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>3.2.0.M1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-openfeign-core</artifactId>
            <version>2.0.0.M2</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.1.0.BUILD-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.1.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <version>2.1.5.RELEASE</version>
        </dependency>

    </dependencies>```


The service which is giving error is

Only the necessary imports are included in this explaination:

import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.script.Script;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.composite.CompositeAggregationBuilder;
import org.elasticsearch.search.aggregations.bucket.composite.CompositeValuesSourceBuilder;
import org.elasticsearch.search.aggregations.bucket.composite.ParsedComposite;
import org.elasticsearch.search.aggregations.bucket.composite.TermsValuesSourceBuilder;
public List<AggregateDocument> compositeAggregation(SearchQuery query) throws IOException {

        SearchRequest searchRequest = new SearchRequest(query.getIndex());

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        for (Map.Entry<String, AggregateQuery> aggregateQueryEntry: query.getAggregateQueryMap().entrySet()) {
            List<CompositeValuesSourceBuilder<?>> sources = new ArrayList<>();

            //Terms Query - Terms

            Query termsQuery = aggregateQueryEntry.getValue().getTermsQuery();

            for (Map.Entry<String,String> termsSourceEntry: termsQuery.getTerms().entrySet()){
                TermsValuesSourceBuilder source = new TermsValuesSourceBuilder(termsSourceEntry.getKey());
                source.field(termsSourceEntry.getValue()).missingBucket(true);
                sources.add(source);
            }

            //CompositeAggregationBuilder compositeQuery = AggregationBuilders.composite(aggregateQueryEntry.getKey(), sources);

            CompositeAggregationBuilder compositeQuery = new CompositeAggregationBuilder(aggregateQueryEntry.getKey(), sources);

            compositeQuery.size(aggregateQueryEntry.getValue().getSize());

            Query sumQuery = aggregateQueryEntry.getValue().getSumQuery();
            Query filterQuery = aggregateQueryEntry.getValue().getFilterQuery();

            //Terms Query - Script

            for (Map.Entry<String,Script> termsScriptEntry: termsQuery.getScript().entrySet()){
                AggregationBuilder subAggregation = AggregationBuilders.terms(termsScriptEntry.getKey()).script(termsScriptEntry.getValue());
                compositeQuery.subAggregation(subAggregation);
            }

            //Sum Query - Terms

            for (Map.Entry<String,String> sumSourceEntry: sumQuery.getTerms().entrySet()){
                AggregationBuilder subAggregation = AggregationBuilders.sum(sumSourceEntry.getKey()).field(sumSourceEntry.getValue());
                //AggregationBuilder subAggregation =new SumAggregationBuilder(sumSourceEntry.getKey()).field(sumSourceEntry.getValue());
                compositeQuery.subAggregation(subAggregation);
            }

            //Sum Query - Script

            for (Map.Entry<String,Script> sumScriptEntry: sumQuery.getScript().entrySet()){
                AggregationBuilder subAggregation = AggregationBuilders.sum(sumScriptEntry.getKey()).script(sumScriptEntry.getValue());
                compositeQuery.subAggregation(subAggregation);
            }

            //Filter Query - Terms

            for (Map.Entry<String,String> filterSourceEntry: filterQuery.getTerms().entrySet()){
                AggregationBuilder subAggregation = AggregationBuilders.sum(filterSourceEntry.getKey()).field(filterSourceEntry.getValue());
                compositeQuery.subAggregation(subAggregation);
            }

            //Filter Query - Script

            for (Map.Entry<String,Script> filterScriptEntry: filterQuery.getScript().entrySet()){
                AggregationBuilder subAggregation = AggregationBuilders.sum(filterScriptEntry.getKey()).script(filterScriptEntry.getValue());
                compositeQuery.subAggregation(subAggregation);
            }

            searchSourceBuilder.aggregation(compositeQuery);
        }

        BoolQueryBuilder queryBuilder = getBoolQueryBuilder(query);
        searchSourceBuilder.query(queryBuilder).size(query.getSize());
        searchRequest.source(searchSourceBuilder);

        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);

        return getCompositeAggregations(response);

    }

getCompositeAggregations (), SearchQuery () - это определенные пользователем метод и классы. Скелет SearchQuery выглядит следующим образом:

@Getter
@AllArgsConstructor
public class SearchQuery {

    String index;
    int from;
    int size;
    Map<String, String> match;
    Map<String, Boolean> boolMatch;
    Map<String, Integer> intMatch;
    String rangeFieldName;
    Map<String, Number> term;
    Map<String, Set<Number>> terms;
    Map<String, AggregateQuery> aggregateQueryMap;
    Map<String,String> stringTerm;

    public SearchQuery() {
        from = 0;
        size = 1000;
        match = new HashMap<>();
        boolMatch = new HashMap<>();
        intMatch = new HashMap<>();
        term = new HashMap<>();
        terms = new HashMap<>();
        stringTerm= new HashMap<>();
        aggregateQueryMap = new HashMap<>();
    }

    public SearchQuery(String index) {
        this.index = index;
        from = 0;
        size = 1000;
        match = new HashMap<>();
        boolMatch = new HashMap<>();
        intMatch = new HashMap<>();
        term = new HashMap<>();
        terms = new HashMap<>();
        stringTerm= new HashMap<>();
        aggregateQueryMap = new HashMap<>();
    }

    public void setSize(int size) { this.size = size; }

    public void putMatch(String key, String val) {
        this.match.put(key, val);
    }

    public void putBoolMatch(String key, Boolean val) {this.boolMatch.put(key, val);}

    public void putIntMatch(String key, Integer val) {this.intMatch.put(key, val);}

    public void putRangeFieldName(String fieldName) {this.rangeFieldName = fieldName;}

    public void putTerm(String key, Number val) {
        this.term.put(key, val);
    }

    public void putTerms(String key, Set<Number> val) {
        this.terms.put(key, val);
    }

    public void putAggregate(String key, AggregateQuery val) {
        this.aggregateQueryMap.put(key, val);
    }

    public void putStringTerm(String key, String value) {
        this.stringTerm.put(key,value);
    }


}


@Getter
@AllArgsConstructor
public class AggregateQuery {

    int size;
    Query termsQuery;
    Query sumQuery;
    Query filterQuery;

    public AggregateQuery() {
        size = 1000;
        termsQuery = new Query();
        sumQuery = new Query();
        filterQuery = new Query();
    }

    public void setSize(int size) { this.size = size; }

    public void putTermsQuery(String name, String field) { this.termsQuery.putTerms(name, field); }

    public void putTermsQuery(String name, Script code) { this.termsQuery.putScript(name, code); }

    public void putSumQuery(String name, String field) { this.sumQuery.putTerms(name, field); }

    public void putSumQuery(String name, Script code) { this.sumQuery.putScript(name, code); }

    public void putFilterQuery(String name, String field) { this.filterQuery.putTerms(name, field); }

    public void putFilterQuery(String name, Script code) { this.filterQuery.putScript(name, code); }


}

До сих пор я пытался очистить .m2 и снова запустить чистую установку, но все же эта ошибка появляется. Буду признателен за любую помощь:

PS: После изменения pom я могу остановить установкуasticsearch 6.5, но 6.4.3 все еще устанавливается. Я хочу только версию 7.2. Любая идея, как найти зависимость, которая вызываетдругие версии для установки

новый модуль Pom of es

        <!-- Elasticsearch dependencies -->
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.2.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-high-level-client -->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.2.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.elasticsearch.plugin/transport-netty4-client -->
        <!--<dependency>
            <groupId>org.elasticsearch.plugin</groupId>
            <artifactId>transport-netty4-client</artifactId>
            <version>7.2.0</version>
        </dependency>-->

       <!-- <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-openfeign-core</artifactId>
            <version>2.0.0.M2</version>
            <scope>compile</scope>
        </dependency>-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.1.0.BUILD-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.1.5.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <version>2.1.5.RELEASE</version>
        </dependency>

    </dependencies>

Это проект агрегатора:

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.vassarlabs.query-builder.proj</groupId>
    <artifactId>query-builder-proj</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <modules>
        <module>es</module>
        <module>ms</module>
    </modules>

    <properties>
        <!-- These Properties are common for all spring R&D for maven build-->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <javac.target>1.8</javac.target>
        <javac.source>1.8</javac.source>
        <spring-framework.version>5.1.0.BUILD-SNAPSHOT</spring-framework.version>
        <spring-boot-version>2.1.0.BUILD-SNAPSHOT</spring-boot-version>
        <kafka.version>1.1.0</kafka.version>
        <logback.version>1.0.13</logback.version>
        <slf4j.version>1.7.25</slf4j.version>
        <junit.version> 4.12 </junit.version>
        <testng.version> 6.10 </testng.version>
        <java.version> 1.8 </java.version>
        <maven.compiler.plugin.version> 3.3 </maven.compiler.plugin.version>
        <maven.surefire.plugin.version> 2.10 </maven.surefire.plugin.version>
        <maven.surefire.report.plugin.version>2.7.2 </maven.surefire.report.plugin.version>
        <jackson.version>2.9.3</jackson.version>
        <common.lang.version>2.4</common.lang.version>
        <vassar.version>1.0-SNAPSHOT</vassar.version>
        <lombok.version>1.16.18</lombok.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring-framework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring-framework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring-framework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring-framework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>${spring-framework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring-framework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${spring-framework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>${testng.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>${common.lang.version}</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <!-- <scope>provided</scope> -->
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.10.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.10.0</version>
        </dependency>
    </dependencies>

<!--

    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/snapshot</url>
            <snapshots><enabled>true</enabled></snapshots>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <url>http://repo.spring.io/milestone</url>
        </repository>
    </repositories>
-->


    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>```

1 Ответ

1 голос
/ 07 октября 2019

Spring Data Elasticsearch 3.2 не работает с Elasticsearch 7;3.2.0.GA использует Elasticsearch 6.8.

Поддержка и адаптация для Easticsearch 7 в текущей текущей основной ветке, которая позже станет версией 4

...