当前位置: 首页 > 知识库问答 >
问题:

如何在Spring项目中使用ElasticSearch的NativeSearchQueryBuilder返回单个对象?

鲁鹏
2023-03-14

我使用NativeSearchQueryBuilder形成查询,如下所示:

 String[] includeFields = new String[]{"idDl", "clientName"};
 String[] excludeFields = new String[]{"Address"};
 Query searchQuery = new NativeSearchQueryBuilder()
                .withQuery(matchQuery("idDl", idDl))
                .withSourceFilter(new FetchSourceFilter(includeFields, excludeFields))
                 .build();
return elasticsearchRestTemplate.queryForObject((StringQuery) searchQuery, User.class);

我想返回没有某些字段的单个对象,这是异常的堆栈跟踪:

java.lang.ClassCastException: org.springframework.data.elasticsearch.core.query.NativeSearchQuery cannot be cast to org.springframework.data.elasticsearch.core.query.StringQuery
at com.user.services.UserQueryServiceImpl.getUserById(UserQueryServiceImpl.java:37) ~[classes/:na]
at com.User.controllers.UserController.getFilteredUserById(UserController.java:100) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_231]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_231]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_231]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_231]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.33.jar:9.0.33]

共有1个答案

洪高阳
2023-03-14

首先,不推荐使用queryForObject,您应该使用searchOne()。至于你的错误:

创建一个NativeSearchQuery,将其分配给类型为Query的变量searchQuery;没关系。但为什么要将其转换为StringQuery?

NativeSearchQuery和StringQuery都实现了查询,所以只需传递查询实例

return elasticsearchRestTemplate.queryForObject(searchQuery, User.class)

编辑Spring Data Elasticsearch 3.2. x:

你应该用

<T> List<T> queryForList(SearchQuery query, Class<T> clazz);

与该版本一样,仍然有NativeSearchQuery实现的SearchQuery接口。从返回的列表中,检查是否包含任何元素,然后使用第一个元素。

 类似资料:
  • 问题内容: 我一直在尝试使用facet来获取字段的频率。我的查询仅返回一次匹配,因此我想让方面返回在特定字段中出现频率最高的字词。 我的映射: 测试数据: 查询: 这个结果 } 以上结果不是我想要的。我想让频率计数为2 我该如何实现?方面走错了路吗? 问题答案: 构面会计算文档,而不是文档中的术语。您得到1是因为只有一个文档包含该术语,所以发生多少次都没有关系。我不知道使用开箱即用的方式来返回术语

  • 我试图使用这个查询返回一个节点对象和一个计算字段。理论上,这应该会返回一个散列,我可以访问每个人,计算并导入velocity模板。

  • 我有以下POJO 在下面的类中,我想直接检索给定人员的嵌套字段“cars”,其名称作为参数传递,但它返回一个具有null值的列表。 但是,如果在上面的searchHits代码中,我将类更改为Person,如下所示,我将返回pojo Person,其中只填写属性“cars”(所有其他属性检索为null): 但是如何直接检索嵌套的属性车?

  • 我正在构建一个定制的Java库。我把我的大部分“重复”代码都保存在那里,比如文件处理、字符串处理等。每次我想使用它们时,我都必须将该类复制并粘贴到我正在进行的其他项目中。有没有办法让这个自定义库类成为“依赖项”?我在用我的智能手机。

  • 问题内容: 我已经研究了许多类似这样的文章和帖子,但在我的情况下不起作用,我只需要使用axios从我的应用程序中的帖子列表中删除一个项目即可。在axios文档中,它说您需要将参数传递给delete方法。另外,在大多数应用中,我都使用过ID,而ID却没有处于状态。但是我不能让它工作。请查看我的整个代码。我知道我的删除方法是错误的,请帮助我修复它: 我还在控制台中看到此错误:未捕获(承诺)TypeEr

  • 如果某些属性匹配,我已经添加了一个QueryBuilders列表。现在,我想使用这些列表进行搜索。 我想创建一个查询使用以上所有queryBuilder。大概是这样的: