首页 > 解决方案 > 如何在 Java 中使用 ElasticSearch JSON DSL?

问题描述

我正在开发一个 springboot 项目,并且在使用 ElasticSearch 时遇到了一些问题。用户会将一些 JSON 格式的 elasticsearch DSL 查询字符串放入数据库中,它们对我来说是黑盒。我需要做的是获取查询字符串并使用它们,以便在弹性搜索中搜索信息。

在 python 中,DSL 可以是这样的参数:

body = {
   "query":{
      "match_all":{}
  }
}
es.search(index="my_index",doc_type="test_type",body=body)

如何在不知道字符串详细信息的情况下仅使用 Java 中的 JSON 格式查询来执行搜索?

标签: javapythonspring-bootelasticsearch

解决方案


我相信在现代 ES 客户端库中有两种方法可以做到这一点。我自己没有尝试过,但第一个似乎很简单。

第一个是使用低级客户端

Request request = new Request("POST", "/index/_search");
request.setJsonEntity(jsonString);
Response response = client.performRequest(request);

似乎只需将 JSON 作为字符串推送到 setJsonEntity 中就足够了,而且您已经设置好了。

第二个是使用高级客户端,虽然它可以提供更强大的API,但这会变得很棘手。您可能知道,elasticsearch 有 XContent 的概念,它是对不同格式的序列化/反序列化,包括 JSON。理论上,可以创建 JsonXContentParser,然后可以使用它来实例化 SearchSourceBuilder:

SearchSourceBuilder.fromXContent(jsonXContentParser);

问题只是 JsonXContentParser 需要实例化多个参数,我不确定如何正确创建这些依赖项。


推荐阅读