weixin_44255720 2023-03-14 00:58 采纳率: 50%
浏览 50
已结题

Java elasticserach

我用attachment pipeline插件实现PDF文本的抽取,单个附件上传解析文本内容没有问题,但是多个附件根据pipeline上传时传不上去
原生的命令都可以执行,但是通过Java api上传不了

多附件文本抽取管道和索引都没问题
下面是单个的上传没有问题

 /**
     * 单个上传文件
     *
     * @param file
     * @throws IOException
     */
    public void uploadEs(FileObj file) throws IOException {
        IndexRequest indexRequest = new IndexRequest("file");

        //上传同时,使用attachment pipline进行提取文件
        indexRequest.source(JSON.toJSONString(file), XContentType.JSON);
        indexRequest.setPipeline("attachment");

        IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
        System.out.println(indexResponse);
    }

多个上传时这个方法行不通

 try {
            BulkRequest bulkRequest = new BulkRequest();
            if (dataList != null && dataList.size() > 0) {
                for (File obj : dataList) {
                    bulkRequest.add(
                            new IndexRequest(index)
                                    .source(JSON.toJSONString(obj), XContentType.JSON).setPipeline("attachment")
                    );
                }
                BulkResponse response = client.bulk(bulkRequest, RequestOptions.DEFAULT);
                if (!response.hasFailures()) {
                    return true;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

最终目的是想要下面官方文档根据管道批量上传对应的Java代码

PUT my_index/_doc/my_id?pipeline=attachment
{
  "attachments" : [
    {
      "filename" : "ipsum.txt",
      "data" : "dGhpcyBpcwpqdXN0IHNvbWUgdGV4dAo="
    },
    {
      "filename" : "test.txt",
      "data" : "VGhpcyBpcyBhIHRlc3QK"
    }
  ]
}

  • 写回答

5条回答 默认 最新

  • 鑫空之眼 2023-03-14 03:59
    关注

    从您提供的代码和问题描述中,我无法判断您遇到的具体问题,可能原因有很多。然而,我可以提供一些可能有助于解决问题的建议和注意事项。

    1. 首先,检查您的 Java 代码是否存在语法错误或逻辑错误。建议使用调试器逐行调试代码,以帮助确定错误发生的位置和原因。

    2. 根据您提供的单个文件上传代码,我们可以看到将 Java 对象序列化为 JSON 格式的方法是 JSON.toJSONString(),这可能会导致某些类型的数据无法正确地序列化为 JSON 格式。因此,建议您使用 Elasticsearch 提供的 Java 客户端 API,为 Java 对象创建索引(如您提供的单个文件上传代码所示),而不是将其序列化为 JSON 格式。

    3. 在使用 Elasticsearch 的 Java 客户端 API 和 BulkRequest 上传多个文档时,确保文档的格式正确,并根据 Elasticsearch 管道要求设置正确的 pipeline 参数。 您可以使用以下代码为多个附件上传文档:

    // 创建多个附件的插入请求
    String index = "my_index";
    String pipeline = "attachment";
    List<Map<String, Object>> attachments = new ArrayList<>();
    for (File file : files) {
        byte[] fileData = Files.readAllBytes(Paths.get(file.getAbsolutePath()));
        String base64Data = Base64.getEncoder().encodeToString(fileData);
        Map<String, Object> attachment = new HashMap<>();
        attachment.put("filename", file.getName());
        attachment.put("data", base64Data);
        attachments.add(attachment);
    }
    XContentBuilder builder = XContentFactory.jsonBuilder().startObject();
    builder.field("attachments", attachments);
    builder.endObject();
    String jsonString = builder.string();
    BulkRequest bulkRequest = new BulkRequest();
    List<String> docIds = new ArrayList<>();
    for (int i = 0; i < files.size(); i++) {
        bulkRequest.add(
            new IndexRequest(index).id(docIds.get(i)).source(jsonString, XContentType.JSON).setPipeline(pipeline)
        );
    }
    BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
    

    在此示例中,我们将多个附件文件读入字节数组中,并将其转换为 Base64 字符串。然后,我们将附件数据和名称组装成 Map,然后将这些 Map 组装成一个包含多个附件的父文档。最后,使用 Elasticsearch 的 Java 客户端 API 将这些父文档集成到 bulkRequest 中,并传递正确的 pipeline 参数。

    希望这些建议和代码示例对您有所帮助。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月15日
  • 已采纳回答 3月14日
  • 创建了问题 3月14日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效