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

如何将Elasticsarch的结果转化为Spring的REST API响应

吕和风
2023-03-14

我已经用Spring开发了一个REST API条目,它在Elasticsearch中执行搜索,现在我想返回ES找到的任何结果作为响应。我不关心搜索结果,也不知道其中的JSON结构。我只想把它还给客户。

我希望这样的事情能奏效:

@RequestMapping(value = "/search/{index:.*}", method = RequestMethod.GET)
public void search(@PathVariable String index, @RequestParam Map allRequestParams, HttpServletResponse response)
    throws IOException
{
    BoolQueryBuilder query = QueryBuilders.boolQuery();
    for (Map.Entry entry : allRequestParams.entrySet()) {
        query.should(QueryBuilders.fuzzyQuery(entry.getKey(), entry.getValue()));
    }

    SearchResponse results = esClient.prepareSearch("nyc_visionzero")
        .setTypes("logs")
        .setQuery(query)
        .execute()
        .actionGet();

    SearchHits hits = results.getHits();
    hits.writeTo(response.getOutputStream());
}

但最后一行有一个编译错误,因为两个OutputStreams不兼容。所以我的问题是,将Elasticsearch的结果与Spring的响应连接起来的最简单的方法是什么?

共有1个答案

马峻
2023-03-14

您可以不尝试写入响应outputstream,而是更改搜索方法的签名以返回一个字符串,然后直接将结果作为有效的JSON返回。类似于:

@RequestMapping(value = "/search/{index:.*}", method = RequestMethod.GET)
public String search(@PathVariable String index, @RequestParam Map allRequestParams, HttpServletResponse response)
    throws IOException
{
    BoolQueryBuilder query = QueryBuilders.boolQuery();
    for (Map.Entry entry : allRequestParams.entrySet()) {
        query.should(QueryBuilders.fuzzyQuery(entry.getKey(), entry.getValue()));
    }

    SearchResponse results = esClient.prepareSearch("nyc_visionzero")
        .setTypes("logs")
        .setQuery(query)
        .execute()
        .actionGet();

    SearchHits hits = results.getHits();

    // Replacing hits.writeTo(response.getOutputStream()); below
    StringBuilder builder = new StringBuilder();
    SearchHit[] hitsDatas = hits.hits();
    int length = hitsDatas.length;
    builder.append("[");
    for (int i = 0; i < length; i++) {
       if (i == length - 1) {
          builder.append(hitsDatas[i].getSourceAsString());
       } else {
          builder.append(hitsDatas[i].getSourceAsString());
          builder.append(",");
       }
    }
    builder.append("]");
    return builder.toString();
}
 类似资料:
  • 问题内容: 我有一个mysqli查询,我需要将其格式化为移动应用程序的JSON。 我已经设法为查询结果生成一个XML文档,但是我正在寻找更轻量的东西。(有关我当前的XML代码,请参见下文) 问题答案: 这样的输出: 如果您想要其他样式,可以尝试以下方法: 输出将是这样的:

  • 问题内容: Django对从数据库返回到JSON格式的ORM模型具有良好的自动序列化功能。 如何将SQLAlchemy查询结果序列化为JSON格式? 我尝试过,但是它编码查询对象本身。我试过了但是回来了 将对象序列化为真的很困难吗?没有默认的序列化程序吗?如今,序列化ORM查询结果是非常常见的任务。 我需要的只是返回SQLAlchemy查询结果的JSON或XML数据表示形式。 javascript

  • 问题内容: 由于使用JDBC连接器进行MySQL查询,因此我有一个结果集。所以我的工作是将结果集转换为JSON格式。这样我就可以将其作为AJAX响应发送到客户端。有人可以解释一下如何转换为JSON格式,因为我对Java和JSON都是新手 问题答案: 许多人正确地回答了这个问题。但是,我认为我可以使用以下几小段代码为该帖子添加更多价值。它使用Apache-DBUtils和Gson库。

  • 我有以下代码,它从Marketo系统中获取一些数据 这将返回给我以下数据 我想做的是,保存这个返回到一个拼花文件。但是当我用下面的代码尝试时,我收到了一条错误消息。 我做错了什么?

  • 我使用Spring数据JPA和Spring Boot应用程序。我有一个属性很少的实体类。假设我有10个属性与实体关联,我只想检索其中的几个(用户名、密码、名字、名字、电子邮件)。 因此,我编写了一个查询,只获取5个字段,但该方法不返回实体对象,而是返回一个普通对象。 如何将查询结果转换为Spring Data JPA中的实体?

  • 问题内容: 我想将流结果输出转换为字符串,因为我想在Junit中使用它,我想我需要使用字符串编写器,但是我不确定如何确切地使用它。 谢谢费多 问题答案: 查看并学习使用StreamResult类的javadocs(http://java.sun.com/javase/6/docs/api/)。StreamResult的构造函数之一采用Writer对象作为参数。您将看到Writer的子类之一是Str