Elasticsearch 7 - 使用 Kibana 的原始 JSON 进行查询

Elasticsearch 7 - query with raw JSON of Kibana

最近我开始使用带有 Java 后端的 Elasticsearch (7.6.x)(我几乎是 ES 的初学者),我有一个一般性问题,我已经搜索过但没有找到答案:

我的工作流程是这样的:

  1. 我打开 kibana 的开发工具控制台并提出要搜索的查询。由于语法对我来说是新的,所以需要一些时间。

  2. 然后我的 DAO-s 中有 RestHighLevelClient。我正在尝试将我在 kibana 中创建的查询“翻译”给众多构建器,以使用 java API 构建查询。显然这也需要一些功夫。

所以我想知道是否有一个方便的 API 允许我通过 Java Java API。如果它存在,我可以使用一些模板引擎来填充占位符,并使用应用的占位符解析来执行编译后的模板。我看到了这种方法的一大优势,因为它可以让我完全绕过步骤“2”...

Kibana 查询示例:

GET telemetry/_search
{
  
  "aggs": {
    "value": {
      "histogram": {
        "field": "value",
        "interval": 50
      }
    }
  }
} 

所以我可以将 json 文件存储在我的 src/main/resources 或其他东西中,因为“间隔”是一个参数,它可能看起来像这样:

{
  
  "aggs": {
    "value": {
      "histogram": {
        "field": "value",
        "interval": {{interval_param}}
      }
    }
  }
} 

然后模板引擎将编译查询(它只能完成一次,但它与问题无关)并且查询 json 可以直接执行:

TemplateEngine engine ...
String query = engine.compile(json_resource).execute(Map.of("interval_param", 50))
API_THAT_IM_LOOKING_FOR.executeQuery(query, "telemetry")

如果存在这样的 API 这种方法的“优点”和“缺点”是什么?与 Java API 相比,它的性能会差吗?它会有一些与安全相关的约束(比如 SQL 类注入等)吗?

您可以使用 Java Low Level REST Client 并通过此方法直接将查询正文作为字符串传递:

request.setJsonEntity("{\"json\":\"text\"}");

一般来说,低级 REST 客户端应该快一点,因为它不序列化请求或解析响应。缺点是额外的代码,并且这些查询字符串可能更难维护。也就是说,我知道您更喜欢直接将查询主体作为字符串传递,因为高级休息客户端恕我直言,有点不直观且设计过度。

低级 REST 客户端为您提供跨可用节点的负载平衡和故障转移机制,并由高级 REST 客户端在后台使用。

您也可以只使用任何 HTTP 客户端直接与您的 Elasticsearch 实例对话。我曾经在一个 c# 项目上工作,在我们意识到高级 .NET 客户端引入的开销很严重之后,我们就这样做了,因为它使用了大量的反射。然后您必须实施自己的负载平衡或故障转移策略。