csv - SOLR - 从 csv 文件导入 2000 万个文档的最佳方法

标签 csv import solr bulkinsert dataimporthandler

我目前手头的任务是找出在 solr 中加载数百万文档的最佳方法。
数据文件是以 csv 格式从 DB 导出的。

目前,我正在考虑将文件拆分为较小的文件并在使用 curl 发布这些较小的文件时编写一个脚本。

我注意到,如果您发布大量数据,大多数情况下请求会超时。

我正在研究数据导入器,这似乎是一个不错的选择

任何其他想法高度赞赏

谢谢

最佳答案

除非数据库已经是您的解决方案的一部分,否则我不会为您的解决方案增加额外的复杂性。引用 SOLR FAQ发出 session 超时的是您的 servlet 容器。

在我看来,您有几个选择(按我的偏好顺序):

增加容器超时

增加容器超时。 (“maxIdleTime”参数,如果您使用嵌入式 Jetty 实例)。

我假设你只是偶尔索引这么大的文件?暂时增加超时可能只是最简单的选择。

拆分文件

这是将完成这项工作的简单 unix 脚本(将文件拆分为 500,000 行块):

split -d -l 500000 data.csv split_files.
for file in `ls split_files.*`
do  
curl 'http://localhost:8983/solr/update/csv?fieldnames=id,name,category&commit=true' -H 'Content-type:text/plain; charset=utf-8' --data-binary @$file
done

解析文件并分块加载

以下 groovy 脚本使用 opencsv 和 solrj 来解析 CSV 文件并每 500,000 行向 Solr 提交更改。
import au.com.bytecode.opencsv.CSVReader

import org.apache.solr.client.solrj.SolrServer
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer
import org.apache.solr.common.SolrInputDocument

@Grapes([
    @Grab(group='net.sf.opencsv', module='opencsv', version='2.3'),
    @Grab(group='org.apache.solr', module='solr-solrj', version='3.5.0'),
    @Grab(group='ch.qos.logback', module='logback-classic', version='1.0.0'),
])

SolrServer server = new CommonsHttpSolrServer("http://localhost:8983/solr/");

new File("data.csv").withReader { reader ->
    CSVReader csv = new CSVReader(reader)
    String[] result
    Integer count = 1
    Integer chunkSize = 500000

    while (result = csv.readNext()) {
        SolrInputDocument doc = new SolrInputDocument();

        doc.addField("id",         result[0])
        doc.addField("name_s",     result[1])
        doc.addField("category_s", result[2])

        server.add(doc)

        if (count.mod(chunkSize) == 0) {
            server.commit()
        }
        count++
    }
    server.commit()
}

关于csv - SOLR - 从 csv 文件导入 2000 万个文档的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9449185/

相关文章:

python - 为什么当列表包含某些内容时,使用 zip() 仅写入 CSV 文件?

javascript - 如何提取 TSV 文件中的信息并将其保存在 JavaScript 数组中?

database - 在 drupal 中每天更新 10,000 个 cck 字段

java - 实例化 CommonsHttpSolrServer 时出现异常

tomcat - 收集 RELOAD 后 SolrCloud 节点关闭

php - 查找 CSV 单元外壳

r - 在R中将矩阵保存到.csv文件而不丢失格式

postgresql - 如何将 PostgreSQL 数据文件导入 Amazon redshift

magento - 将 XML 从 URL 导入/解析到 Magento 中

c# - Lucene 作为数据存储