# Percolator on Elasticsearch version 8 with JAVA API

**URL:** <https://discuss.elastic.co/t/percolator-on-elasticsearch-version-8-with-java-api/344343>\
**Category:** Elasticsearch\
**Tags:** language-clients\
**Created:** [October 3, 2023, 7:44pm UTC](https://discuss.elastic.co/t/percolator-on-elasticsearch-version-8-with-java-api/344343 "2023-10-03T19:44:54Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![sloren](https://avatars.discourse-cdn.com/v4/letter/s/df788c/32.png) [@sloren](https://discuss.elastic.co/u/sloren)\
**Post date:** [October 3, 2023, 7:44pm UTC](https://discuss.elastic.co/t/percolator-on-elasticsearch-version-8-with-java-api/344343/1 "2023-10-03T19:44:54Z")

</div>

Hello,  
Is there a way to use the percolator in the new version of Elasticsearch (8.8.2) with the Java API?

my index mapping

```auto
{
  "my_index_1": {
    "mappings": {
      "dynamic": "strict",
      "properties": {
        "email": {
          "type": "keyword"
        },
        "id": {
          "type": "integer"
        },
        "name": {
          "type": "text"
        },
        "query": {
          "type": "percolator"
        }
      }
    }
  }
}

```

I cannot save a percolator field to my index with the Java API . Before version 8.0, I was using PerculateQueryBuilder. Is this now deprecated?

thanks.

---

<div class="post-metadata">

**Author:** ![dadoonet](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dadoonet/32/137187_2.png) [@dadoonet](https://discuss.elastic.co/u/dadoonet)\
**Post date:** [October 4, 2023, 10:01am UTC](https://discuss.elastic.co/t/percolator-on-elasticsearch-version-8-with-java-api/344343/2 "2023-10-04T10:01:40Z")

</div>

> [@sloren](#):
>
> I cannot save a percolator field to my index with the Java API

Could you share your code please? And the full stacktrace error you are getting?

> [@sloren](#):
>
> Is this now deprecated?

No. See [Percolator field type | Elasticsearch Guide [8.11] | Elastic](https://www.elastic.co/guide/en/elasticsearch/reference/current/percolator.html).

---

<div class="post-metadata">

**Author:** ![sloren](https://avatars.discourse-cdn.com/v4/letter/s/df788c/32.png) [@sloren](https://discuss.elastic.co/u/sloren)\
**Post date:** [October 5, 2023, 9:29pm UTC](https://discuss.elastic.co/t/percolator-on-elasticsearch-version-8-with-java-api/344343/3 "2023-10-05T21:29:13Z")

</div>

Thanks for replying @dadoonet

> [@dadoonet](#):
>
> No. See [Percolator field type | Elasticsearch Guide [8.10] | Elastic ](https://www.elastic.co/guide/en/elasticsearch/reference/current/percolator.html).

I can't find an equivalent in the Java API

**MyObjectModel.java**

```auto
public class MyObjectModel {
    private String id;
    private String name;
    private String email;
    private PercolateQuery query; // ?
}

```

**SearchService.java**

```auto
    public void save(RequestModel requestModel) throws IOException {
        PercolateQuery percolateQuery = getPercolateQuery(requestModel);
        MyObjectModel myObjectModel = MyObjectModel.builder()
                .id(requestModel.getId().toString())
                .email(requestModel.getEmail())
                .name(requestModel.getName())
                .query(percolateQuery)
                .build();
        elasticRepository.saveToElasticsearch(myObjectModel.getId(), myObjectModel);
    }
    private PercolateQuery getPercolateQuery(RequestModel requestModel) {
        BoolQuery.Builder boolQueryBuilder = new BoolQuery.Builder();
        if (requestModel.getEmail() != null) {
            boolQueryBuilder.filter(q1 -> q1.term(q2 -> q2.field("email").value(requestModel.getName())));
        }
        Query query = boolQueryBuilder.build()._toQuery();
        JsonData jsonData = JsonData.fromJson(new Gson().toJson(query));
        return PercolateQuery.of(x->x.field("query").document(jsonData));
    }

```

**ElasticRepository.java**

```auto
    public void saveToElasticsearch(String id, MyObjectModel myObjectModel) throws IOException {
            elasticsearchClient.index(i -> i.index(myIndexAlias).id(id).document(myObjectModel));
    }

```

**Error message:**

```auto
threw exception [Request processing failed; nested exception is co.elastic.clients.elasticsearch._types.ElasticsearchException: [es/index] failed: [document_parsing_exception] [1:68] failed to parse: query malformed, empty clause found at [1:68]] with root cause

co.elastic.clients.elasticsearch._types.ElasticsearchException: [es/index] failed: [document_parsing_exception] [1:68] failed to parse: query malformed, empty clause found at [1:68]
	at co.elastic.clients.transport.rest_client.RestClientTransport.getHighLevelResponse(RestClientTransport.java:337) ~[elasticsearch-java-8.8.2.jar:na]
	at co.elastic.clients.transport.rest_client.RestClientTransport.performRequest(RestClientTransport.java:155) ~[elasticsearch-java-8.8.2.jar:na]
	at co.elastic.clients.elasticsearch.ElasticsearchClient.index(ElasticsearchClient.java:1121) ~[elasticsearch-java-8.8.2.jar:na]
	at co.elastic.clients.elasticsearch.ElasticsearchClient.index(ElasticsearchClient.java:1138) ~[elasticsearch-java-8.8.2.jar:na]
	at com.demo.percolation.repository.ElasticRepository.saveToElasticsearch(ElasticRepository.java:52) ~[classes/:na]
	at com.demo.percolation.service.SearchService.save(SearchService.java:42) ~[classes/:na]
	at com.demo.percolation.controller.Controller.save(Controller.java:25) ~[classes/:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.23.jar:5.3.23]
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.23.jar:5.3.23]
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1071) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:681) ~[tomcat-embed-core-9.0.65.jar:4.0.FR]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) ~[tomcat-embed-core-9.0.65.jar:4.0.FR]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.65.jar:9.0.65]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.23.jar:5.3.23]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.23.jar:5.3.23]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.23.jar:5.3.23]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.23.jar:5.3.23]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.23.jar:5.3.23]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.23.jar:5.3.23]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]

```

---

<div class="post-metadata">

**Author:** ![Indu\_Nallithodi](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/indu_nallithodi/32/53063_2.png) [@Indu\_Nallithodi](https://discuss.elastic.co/u/Indu_Nallithodi)\
**Post date:** [October 8, 2023, 9:39am UTC](https://discuss.elastic.co/t/percolator-on-elasticsearch-version-8-with-java-api/344343/4 "2023-10-08T09:39:01Z")

</div>

PercolateQueryBuilder is deprecated.

Can use /\_bulk update to save json-Query as an asset with fields to index.  
And for percolate action  
One option is to use custom builder with - Java Map as lowlevel to generate percolate and use any JsonobjectMapper and use /search API

```plaintext
{
    "query": {
        "percolate": {
            "field": "query",
            "document": {
                "id": "<id>",
                "type": "<type>"
            }
        }
    }
}

```

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [November 5, 2023, 9:39am UTC](https://discuss.elastic.co/t/percolator-on-elasticsearch-version-8-with-java-api/344343/5 "2023-11-05T09:39:32Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
