繁体   English   中英

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 API 直接在 ElasticSearch 上执行我在步骤 1 中准备的 JSON 查询。 如果存在,我可以使用一些模板引擎来填充占位符,并使用应用的占位符分辨率执行编译后的模板。 我看到了这种方法的一大优势,因为它可以让我完全绕过我的步骤“2”......

Kibana 中的查询示例:

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

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

{
  
  "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 实例对话。 我曾经在 ac# 项目中工作,在我们意识到高级 .NET 客户端引入的开销很严重后,我们就这样做了,因为它使用了大量反射。 然后,您必须实施自己的负载平衡或故障转移策略。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM