elasticsearch 有没有一种方法可以使用Opensearch Java客户端进行原始JSON请求?

omjgkv6w  于 2023-05-12  发布在  ElasticSearch
关注(0)|答案(1)|浏览(132)

bounty还有3天到期。回答此问题可获得+50声望奖励。Bakar希望引起更多关注这个问题。

Opensearch Java Client没有在原始JSON请求中接受它的方法。
所有这些方法都需要在执行请求之前存在一些JavaPOJO/Class,例如创建索引或甚至向索引添加文档。
我尝试过使用JSON Deserializers和JacksonObjectMapper将JSON转换为Opensearch请求类型,但它没有本地Map。

n53p2ov0

n53p2ov01#

我不认为有一个支持的方式来做到这一点。JSON Deserializers似乎仅用于相应请求的JSON主体(即CreateIndexRequest中的“aliases”、“mappings”和“settings”),因此任何不属于预期JSON主体的不可空字段都需要单独传入。目前公开的方法并不真正允许这种情况。一个很简单的方法是使用protected(!)使用反射设置API的方法。
示例:

private static ObjectDeserializer<CreateIndexRequest.Builder> getDeserializerWithPreconfiguredBuilder(
            Supplier<CreateIndexRequest.Builder> builderSupplier) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
  Class<CreateIndexRequest> clazz = CreateIndexRequest.class;
  Method method = clazz.getDeclaredMethod("setupCreateIndexRequestDeserializer", ObjectDeserializer.class);
  method.setAccessible(true);

  ObjectDeserializer<CreateIndexRequest.Builder> deserializer = new ObjectDeserializer<>(builderSupplier);
  method.invoke(null, deserializer);
  return deserializer;
}

然后

JsonParser jsonParser = JsonProvider.provider().createParser(new StringReader("{}")); // <-- your JSON request body
Supplier<CreateIndexRequest.Builder> builderSupplier = () -> new CreateIndexRequest.Builder().index("my-index");
ObjectDeserializer<CreateIndexRequest.Builder> deserializer = getDeserializerWithPreconfiguredBuilder(builderSupplier);
CreateIndexRequest req = deserializer.deserialize(jsonParser, new JsonbJsonpMapper()).build();

顺便说一下:Elasticsearch has added对API的原始JSON支持。OpenSearch可以从中得到一些启发。

相关问题