Elasticsearch 6.1.2:如何通过JSON用Java高级API构建SearchRequest?
Elasticsearch 6.1.2:通过JSON查询构建SearchRequest的异常解决办法
你遇到的namedObject is not supported for this parser异常,本质是因为你用了空的NamedXContentRegistry来解析JSON查询——这个空注册表根本不知道怎么处理ES里的各种查询类型(比如match、term这些),所以解析直接失败了。
下面给你两种解决思路,优先推荐第一种,简单又靠谱:
方法一:直接用SearchSourceBuilder的source重载方法
SearchSourceBuilder本身就提供了直接接收JSON字符串的方法,内部已经帮你处理好了解析所需的注册表,完全不用自己手动创建XContentParser:
String jsonQuery = "..."; // 你的JSON查询语句 SearchRequest searchRequest = new SearchRequest(); SearchSourceBuilder builder = new SearchSourceBuilder().source(jsonQuery, XContentType.JSON); searchRequest.source(builder);
这个方法代码简洁,还能避免手动处理解析器的各种坑,是6.x版本里最推荐的方式。
方法二:手动传入正确的NamedXContentRegistry(进阶用法)
如果你一定要用fromXContent方法,那必须传入包含ES查询类型解析器的注册表。你可以通过RestHighLevelClient获取现成的注册表,或者手动构建:
方式1:通过RestHighLevelClient获取注册表
// 假设你已经初始化了RestHighLevelClient实例 RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http"))); String jsonQuery = "..."; XContentParser parser = XContentType.JSON.xContent() .createParser(client.getXContentRegistry(), jsonQuery); SearchSourceBuilder builder = SearchSourceBuilder.fromXContent(parser); SearchRequest searchRequest = new SearchRequest().source(builder);
方式2:手动构建包含查询解析器的注册表
// 收集所有ES查询构建器的解析规则 List<NamedXContentRegistry.Entry> entries = new ArrayList<>(); entries.addAll(QueryBuilders.getNamedXContent()); // 创建有效的注册表 NamedXContentRegistry registry = new NamedXContentRegistry(entries); // 用这个注册表创建解析器并构建SearchSourceBuilder XContentParser parser = XContentType.JSON.xContent() .createParser(registry, jsonQuery); SearchSourceBuilder builder = SearchSourceBuilder.fromXContent(parser); SearchRequest searchRequest = new SearchRequest().source(builder);
简单说,第一种方法足够满足大多数场景,除非你有特殊的自定义解析需求,否则没必要用第二种。
内容的提问来源于stack exchange,提问作者Jotschi
相关产品推荐
相关产品推荐

