Elasticsearch 搜索和排序错误:解析异常 - 格式错误的查询

问题描述 投票:0回答:1

我正在努力在我的 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 查询来组合多个匹配查询,我怀疑查询结构可能存在问题。这是相关的代码片段:

@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);

我已经仔细检查了查询语法,它对我来说似乎是正确的。您能否帮我找出问题并提供如何修复此错误的指导?

java elasticsearch spring-data-elasticsearch
1个回答
0
投票

@Query
的参数是搜索请求的唯一查询部分,而不是任何排序或过滤参数(请使用文本块而不是不可读的
\"
转义)。您必须使用
Sort
:

类型的附加参数来传递这些参数
@Query("""
                {
                    "bool": {
                        "should": [
                            {
                                "match": {"name": "?0"}
                            },
                            {
                                "match": {"email": "?1"}
                            },
                            {
                                "match": {"address": "?2"}
                            },
                            {
                                "match": {"phone": "?3"}
                            }
                        ]
                    }
                }
                """)
List<User> partialSearch(String name, String email, String address, String phone, Sort sort);

在调用此方法的地方,您可以像这样构建排序:

var sort = Sort.by(sortField).ascending(); // or use .descending()
var users = partialSearch(name, email, address, phone, sort)

作为为这样的简单搜索指定查询部分的替代方法,您可以定义一个存储库方法,如下所示:

List<Users> findByNameAndEmailAndAddressAndPhone(Sort sort);

并让 Spring Data Elasticsearch 处理查询构建。

© www.soinside.com 2019 - 2024. All rights reserved.