我正在努力在我的 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);
我已经仔细检查了查询语法,它对我来说似乎是正确的。您能否帮我找出问题并提供如何修复此错误的指导?
@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 处理查询构建。