我目前手头的任务是找出在 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/