当前位置: 首页 > 知识库问答 >
问题:

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

阚夕
2023-03-14

最近,我开始在Java后端使用Elasticsearch(7.6.x)(我基本上是ES的初学者),我有一个一般性的问题,我搜索了这个问题,但没有找到答案:

我的工作流程如下:

>

  • 我打开kibana的开发工具控制台,想出一个要搜索的查询。因为语法对我来说是新的,所以需要一些时间。

    然后我的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注入等)?

  • 共有1个答案

    郭通
    2023-03-14

    您可以使用Java低级REST客户端,并通过以下方法直接将查询正文作为字符串传递:

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

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

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

    您也可以使用任何HTTP客户端直接与Elasticsearch实例对话。我曾经在一个c#项目中工作,在我们意识到高层带来的开销之后,我们就这样做了。NET客户端是认真的,因为它使用了大量的反射。然后,您必须实施自己的负载平衡或故障切换策略。

     类似资料:
    • 问题内容: 因此,我有一个很小的查询可以在我的数据库上运行,并且在MySQL Workbench中可以正常工作。基本上,再次使用带有左联接的SELECT和带有左联接的UNION。 在尝试将其翻译为Laravel时没有成功。 我遇到了错误 Builder.php 1249行中的ErrorException:未定义的属性:Illuminate \ Database \ Eloquent \ Build

    • 因此,我在数据库上运行了这个小查询,它在MySQL工作台上运行良好。基本上,使用左连接进行选择,然后再次使用左连接进行并集。 年,他试图把它翻译成拉威尔,但没有成功。 我发现了错误 生成器中的错误异常。php第1249行:未定义的属性:Illumb\Database\Eloquent\Builder::$bindings 我如何在Laravel中执行一个完全原始的查询,或者如何在Laravel中以

    • 在模型查询API不够用的情况下,你可以使用原始的sql语句。django提供两种方法使用原始sql进行查询:一种是使用Manager.raw()方法,进行原始查询并返回模型实例;另一种是完全避开模型层,直接执行自定义的sql语句。 警告 编写原始的sql语句时,应该格外小心。每次使用的时候,都要确保转义了参数中的任何控制字符,以防受到sql注入攻击。更多信息请参阅防止sql注入。 进行原始查询 r

    • 问题内容: 有没有办法从获取原始/原始JSON值? 问题: 现在是,但是我需要原始字符串。 有没有办法获得这个原始价值?另外,我无法更改创建方式(例如更改设置),因为它作为参数传递给我的课程… (参考:原始的NJsonSchema问题) 问题答案: 您无法获取原始字符串,无法识别日期字符串并将其转换为自身内部的结构。如果您这样做,则可以看到以下内容: 但是,您可以通过执行以下操作以ISO 8601

    • 问题内容: 我正在使用PHP curl进行发布,由于某种原因,我无法成功发布该表单。 当我尝试在帖子中使用相同功能时,它可以工作,但不适用于PHP。 问题答案: 如果您想使用和数据,似乎您的数据应采用格式

    • 我在spring web应用程序中有以下要求: 从Elasticsearch中查找对象并在谷歌地图上显示(首选json格式) 从Elasticsearch中查找对象(与上面的查询相同),并将其显示在列表中(首选java对象格式,以便在JSP页面上显示) 我使用SearchRequestBuilder编写了Java API搜索,效果很好: 但是为了在谷歌地图上显示它,我更喜欢从elasticsear