使用spring-boot-starter-data-elasticsearch查询Elasticsearch报错解析
报错原因及解决方案:unknown query [query] in StringQuery
错误原因
StringQuery的构造参数仅接受单个查询对象的JSON内容,对应Elasticsearch搜索请求中query字段的值,而非完整的搜索请求体。你传入的JSON包含了顶层的"query"键,这会让Elasticsearch尝试将整个结构解析为一个查询类型,但"query"并不是Elasticsearch支持的查询类型,因此抛出parsing_exception。
修正后的代码
移除外层的"query"包裹,只保留query_string查询的JSON部分:
@GetMapping("/search") public void searchResume(@RequestParam(name = "search") String query) { Query q = new StringQuery(""" { "query_string": { "query": "my search input" } } """); System.out.println(operations.search(q, Resume.class)); }
如果需要动态替换搜索关键词,可将请求参数嵌入JSON(注意:若query包含特殊字符需做转义,避免JSON语法错误):
@GetMapping("/search") public void searchResume(@RequestParam(name = "search") String query) { String queryJson = String.format(""" { "query_string": { "query": "%s" } }""", query); Query q = new StringQuery(queryJson); System.out.println(operations.search(q, Resume.class)); }
更推荐的写法:类型安全API
使用Elasticsearch客户端提供的类型安全API构建查询,避免JSON字符串的语法错误:
@GetMapping("/search") public void searchResume(@RequestParam(name = "search") String query) { Query q = Query.of(builder -> builder .queryString(qsBuilder -> qsBuilder.query(query))); System.out.println(operations.search(q, Resume.class)); }
内容的提问来源于stack exchange,提问作者0xJanAbe
相关产品推荐
相关产品推荐

