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

nzk0hqpo  于 2023-11-17  发布在  ElasticSearch
关注(0)|答案(1)|浏览(176)

我正在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);


我已经仔细检查了查询语法,它似乎是正确的。你能帮助我确定问题并提供如何修复此错误的指导吗?

bttbmeg0

bttbmeg01#

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

字符串
在调用这个方法的地方,你可以像这样构建Sort:

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


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

List<Users> findByNameAndEmailAndAddressAndPhone(String, name, String email, String address, String phone, Sort sort);


并让Spring Data Elasticsearch处理查询构建,请参阅参考文档

相关问题