我正在Java应用程序中使用Elasticsearch实现搜索和排序功能。我使用的是Elasticsearch版本8.10.4和Spring Data Elasticsearch版本5.1.5。当我尝试执行搜索操作沿着排序时,我遇到了以下错误:
co.elastic.clients.elasticsearch._types.ElasticsearchException: [es/search] failed: [parsing_exception] [bool] malformed query, expected [END_OBJECT] but found [FIELD_NAME]
at co.elastic.clients.transport.rest_client.RestClientTransport.getHighLevelResponse(RestClientTransport.java:334) ~[elasticsearch-java-8.7.1.jar:na]
at co.elastic.clients.transport.rest_client.RestClientTransport.performRequest(RestClientTransport.java:154) ~[elasticsearch-java-8.7.1.jar:na]
at co.elastic.clients.elasticsearch.ElasticsearchClient.search(ElasticsearchClient.java:1882) ~[elasticsearch-java-8.7.1.jar:na]
at org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate.lambda$count$13(ElasticsearchTemplate.java:319) ~[spring-data-elasticsearch-5.1.5.jar:5.1.5]
字符串
我使用bool查询来组合多个match查询,我怀疑查询结构可能有问题。下面是相关的代码片段:
@Query("{\"bool\": {\"should\": [" +
"{\"match\": {\"name\": \"?0\"}}, " +
"{\"match\": {\"email\": \"?1\"}}, " +
"{\"match\": {\"address\": \"?2\"}}, " +
"{\"match\": {\"phone\": \"?3\"}}" +
"]}," +
"\"sort\": [{\"sortField\": \"?4\"}, {\"sortOrder\": \"?5\"}]}}")
List<User> partialSearch(String name, String email, String address, String phone, String sortField, String sortOrder);
型
我已经仔细检查了查询语法,它似乎是正确的。你能帮助我确定问题并提供如何修复此错误的指导吗?
1条答案
按热度按时间bttbmeg01#
@Query
的参数是搜索请求中唯一的查询部分,而不是任何排序或过滤参数(请使用文本块而不是不可读的\"
转义)。您必须传递这些与Sort
类型的附加参数:字符串
在调用这个方法的地方,你可以像这样构建Sort:
型
作为为这样的简单搜索指定查询部分的替代方案,您可以像这样定义一个存储库方法:
型
并让Spring Data Elasticsearch处理查询构建,请参阅参考文档