Spring Data Elasticsearch 批量索引/删除 - 数百万条记录

2024-01-15

我正在使用 Spring Data Elasticsearch 4.2.5,我们有一项工作对特定的数据库表执行 ETL(提取、转换和加载数据)。我在作业运行时使用 Elasticsearch 为这些数据建立索引。数据将达到数百万条甚至更多。目前,我正在对每次迭代进行索引。我读到,在每次迭代中使用 elasticsearch 索引可能需要一些时间。我想使用像bulk-index这样的东西,但为此我需要将indexQuery对象添加到List中。添加数百万条记录到列表并进行批量索引可能会带来内存问题。

我需要应用类似的删除过程。当根据一些常见的ID删除记录时,我需要删除相关的弹性文档,这也将是数百万甚至更多。

无论如何,是否可以针对此要求非常快速地进行索引/删除?非常感谢任何帮助,如果我的理解不正确,请纠正我。

INDEXING

for (Map.Entry<Integer, ObjectDetails> key : objectDetailsHashMap.entrySet()) {
    indexDocument(elasticsearchOperations, key, oPath);
    // other code to insert data in db table...
 }

private void indexDocument(ElasticsearchOperations elasticsearchOperations,
                              Map.Entry<Integer, ObjectDetails> key, String oPath) {
    String docId = "" + key.getValue().getCatalogId() + key.getValue().getObjectId();

    byte[] nameBytes = key.getValue().getName();
    byte[] physicalNameBytes = key.getValue().getPhysicalName();
    byte[] definitionBytes =  key.getValue().getDefinition();
    byte[] commentBytes = key.getValue().getComment();

    IndexQuery indexQuery = new IndexQueryBuilder()
            .withId(docId)
            .withObject(new MetadataSearch(
                    key.getValue().getObjectId(),
                    key.getValue().getCatalogId(),
                    key.getValue().getParentId(),
                    key.getValue().getTypeCode(),
                    key.getValue().getStartVersion(),
                    key.getValue().getEndVersion(),
                    nameBytes != null ? new String(nameBytes, StandardCharsets.UTF_8) : "-",
                    physicalNameBytes != null ? new String(physicalNameBytes, StandardCharsets.UTF_8) : "-",
                    definitionBytes != null ? new String(definitionBytes, StandardCharsets.UTF_8) : "-",
                    commentBytes != null ? new String(commentBytes, StandardCharsets.UTF_8) : "-",
                    oPath
            ))
            .build();

    elasticsearchOperations.index(indexQuery, IndexCoordinates.of("portal_idx"));
}

DELETING

private void deleteElasticDocuments(String catalogId) {
    String queryText = martServerContext.getQueryCacheInstance().getQuery(QUERY_PORTAL_GET_OBJECTS_IN_PORTAL_BY_MODEL);
    MapSqlParameterSource mapSqlParameterSource = new MapSqlParameterSource();
    mapSqlParameterSource.addValue("cId", Integer.parseInt(catalogId));
    namedParameterJdbcTemplate.query(queryText, mapSqlParameterSource, (resultSet -> {
        int objectId = resultSet.getInt(O_ID);
        String docId = catalogId + objectId;
        elasticsearchOperations.delete(docId, IndexCoordinates.of("portal_idx"));
    }));
}

为了添加文档,您可以使用批量索引,例如通过收集要在列表/数组或其他内容中索引的文档,当达到预定义的大小(例如 500 个条目)时,然后对这些文档进行批量插入。

对于删除,没有批量操作,但您可以收集要在列表或数组中删除的 ID,并使用最大大小,然后使用ElasticsearchOperations.idsQuery(List<String>)为这些 id 创建查询并将其传递到delete(query) method.

编辑 2021 年 9 月 29 日:

the idsQuery刚刚在 4.3 分支中添加,它是简单的这样(https://github.com/spring-projects/spring-data-elasticsearch/blob/main/src/main/java/org/springframework/data/elasticsearch/core/AbstractElasticsearchRestTransportTemplate.java#L193-L200 https://github.com/spring-projects/spring-data-elasticsearch/blob/main/src/main/java/org/springframework/data/elasticsearch/core/AbstractElasticsearchRestTransportTemplate.java#L193-L200):

@Override
public Query idsQuery(List<String> ids) {

    Assert.notNull(ids, "ids must not be null");

    return new NativeSearchQueryBuilder().withQuery(QueryBuilders.idsQuery().addIds(ids.toArray(new String[] {})))
            .build();
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Data Elasticsearch 批量索引/删除 - 数百万条记录 的相关文章

随机推荐

  • 如何将多个函数应用于 groupby 对象

    例如 我有两个 lambda 函数可应用于分组数据框 df groupby A B apply lambda g df groupby A B apply lambda g 两者都可以工作 但组合起来就不行了 df groupby A B
  • 在 Tkinter 主循环期间录制 OpenCV 视频

    我正在开发一项心理学实验 分析用户在完成行为任务时所做的面部表情 该应用程序主要通过 Tkinter 运行 我使用 openCV 来捕获视频 在最小的情况下 我需要根据用户响应开始和停止录制 例如 在下面的代码中 我希望用户使用鼠标按下按钮
  • 当 pthread_attr_t 不为 NULL 时?

    POSIX 线程中 pthread create 的所有参数都非常容易理解 除了线程属性 什么是线程属性不应该被初始化的原因 方式和时间NULL 我经历了Linuxman page http man7 org linux man pages
  • 使用 codeigniter 发送简单的电子邮件

    我正在尝试使用 codeigniter 发送简单的电子邮件 如解释此链接所示Codeigniter 电子邮件类 https www codeigniter com user guide libraries email html 但它不起作用
  • 在 C++14 / C++11 中隐藏 中的 isnan?

    我这里有一个小型测试应用程序 它使用isnan from
  • 这是哈希密码的安全方法吗?

    您能否告诉我以下是否是安全地散列密码以存储在数据库中的好方法 public string CreateStrongHash string textToHash byte salt System Text Encoding ASCII Get
  • SQL MAX(DATE) 订单号

    我有以下查询 SELECT o ClientId o MAX Date o OrderNumber FROM dbo tblOrders GROUP BY o ClientId o OrderNumber 这仍然给我所有订单号 我如何才能只
  • 如何使用 Javascript 在 Google Map v3 中使用 GTFS feed?

    我第一次尝试将 GTFS 通用交通源规范 与 Google 地图结合使用 根据 Google 开发人员页面 我已经了解了用作源的 txt 文件的概念 为了制作演示 我从以下位置下载了一个交通 zip 文件谷歌开发者页面 但我不知道如何使用这
  • 如何在 .htaccess 文件中编写 if - elseif - else if 条件块?

    这就是我想用伪代码完成的事情 if server host equals productionsite com then RewriteBase else if server host equals stagingsite com then
  • Python装饰类

    我正在尝试装饰一个class有参数但无法让它工作 这是装饰器 def message param1 param2 def get message func func init param1 param2 return get message
  • spring 添加默认值到 form:select

    我正在开发一个 Spring 应用程序 现在我使用以下方法向我的 jsp 页面之一添加了一个下拉列表
  • jQuery 将类添加到特定的 div

    我有一段代码正在读取购物篮中有多少商品 我想向 ID 为 basket count 的 div 添加一个类 我知道如何在出现计数器的情况下将类添加到 span 标记 不知道如何从这里开始 任何帮助将不胜感激 span ctl00 lblIt
  • 更改java中的输入语言

    我的申请是希伯来语的 运行我的应用程序的计算机都将英语设置为默认语言 将希伯来语设置为第二语言 每次他们需要向我的 JTextFields 输入内容时 他们都必须 alt shift 来更改语言 他们中的一些人甚至不看显示器就开始写 我得到
  • Office Open XML 项目符号列表

    我正在尝试创建一个 Office 打开的 xml 文档 其中包含项目符号列表 但该文档没有显示项目符号 而是显示了编号列表 这就是我寻找的 第 1 款 第 2 段 相反 我得到以下列表 第 1 款 第 2 段 我已经深入挖掘了网络并用谷歌搜
  • 在 android java 类中使用 Kotlin 扩展

    是否可以在 android java 类中使用 kotlin 扩展 例子 fun String getSomething String return something 然后在Java中像这样使用它 String someString bl
  • 桌面通知不允许在 Chrome 上运行

    所以我希望我的网页在加载时提示对桌面通知进行验证 所以我在body中添加了onload 这在 mozilla firefox 上工作得很好 但在 Google chrome 中它不会显示问题 但如果我像这样调用该函数 它就会起作用 a hr
  • 当有足够可用内存时 CUDA 内存不足

    I m having trouble with using Pytorch and CUDA Sometimes it works fine other times it tells me RuntimeError CUDA out of
  • 如何在没有应用程序默认凭据或 Cloud SDK 的情况下对 Google Cloud API 进行身份验证?

    我正在尝试从 AWS Lambda 函数访问 Google Cloud API 但我不知道如何进行身份验证 Google Cloud 文档中的身份验证指南 https cloud google com docs authentication
  • 加快excel格式化vba代码的速度?

    我正在使用以下 vba 代码将文本字符串日期更改为 Excel 中的实际日期 以便我可以将其用于逻辑比较等 问题是我需要这个来处理大约 4000 行并每周更新一次 而且这个代码非常慢 Sub Datechange Dim c As Rang
  • Spring Data Elasticsearch 批量索引/删除 - 数百万条记录

    我正在使用 Spring Data Elasticsearch 4 2 5 我们有一项工作对特定的数据库表执行 ETL 提取 转换和加载数据 我在作业运行时使用 Elasticsearch 为这些数据建立索引 数据将达到数百万条甚至更多 目