在一个请求中将多个文件索引到 Solr 并为每个文件添加字段
Index multiple files to Solr in one request and add fields for each file
作为最佳实践,我尝试在一次请求中将一堆文档索引到 Solr,而不是一次索引一个。现在我遇到的问题是,我正在编制索引的文件属于不同类型(pdf、word 文档、文本文件……),因此具有从 Tika 中提取并编制索引的不同元数据。
我想对所有文件都有一定的 fields/information,不管类型如何,例如创建者、创建日期和路径,但是我不知道如何在索引所有文件时手动添加字段一次。
如果我一次索引一个文件,我可以只添加带有 request.setParam() 的字段,但这是针对整个请求而不是针对一个文件。即使这样的事情是可能的,我如何在 Java 中获取文件创建者等信息?
是否可以为每个文件添加字段?
if(listOfFiles != null) {
for (File file : listOfFiles) {
if (file.isFile()) {
request.addFile(file, getContentType(file));
//add field only for this file?
}else{
//Folder, call the same method again -> recursion
request = addFilesToRequest(file, request);
}
}
}
据我所知,无法在同一请求中提交多个文件。无论如何,这些请求的处理量通常非常大,因此降低 HTTP 请求量可能不会对总处理时间产生太大影响。
如果你想加快速度,你可以process all your files locally with Tika first(Tika 也是 Solr 内部使用的),然后只提交提取的数据。这样你就可以多线程提取过程,将结果添加到队列中,并让 Solr 提交过程随着队列的增长而执行——所有内容都以几个更大的批次提交给 Solr(例如一次 1000 个文档)。
这还允许您扩展索引过程,而无需添加更多 Solr 服务器来使该部分过程运行得更快(如果您的 Solr 节点可以跟上搜索流量,则不需要扩展它只是为了处理文件)。
手动使用 Tika 还可以更轻松地在处理过程中更正或更改细节,例如文件格式返回不同时区的日期等。
作为最佳实践,我尝试在一次请求中将一堆文档索引到 Solr,而不是一次索引一个。现在我遇到的问题是,我正在编制索引的文件属于不同类型(pdf、word 文档、文本文件……),因此具有从 Tika 中提取并编制索引的不同元数据。 我想对所有文件都有一定的 fields/information,不管类型如何,例如创建者、创建日期和路径,但是我不知道如何在索引所有文件时手动添加字段一次。 如果我一次索引一个文件,我可以只添加带有 request.setParam() 的字段,但这是针对整个请求而不是针对一个文件。即使这样的事情是可能的,我如何在 Java 中获取文件创建者等信息?
是否可以为每个文件添加字段?
if(listOfFiles != null) {
for (File file : listOfFiles) {
if (file.isFile()) {
request.addFile(file, getContentType(file));
//add field only for this file?
}else{
//Folder, call the same method again -> recursion
request = addFilesToRequest(file, request);
}
}
}
据我所知,无法在同一请求中提交多个文件。无论如何,这些请求的处理量通常非常大,因此降低 HTTP 请求量可能不会对总处理时间产生太大影响。
如果你想加快速度,你可以process all your files locally with Tika first(Tika 也是 Solr 内部使用的),然后只提交提取的数据。这样你就可以多线程提取过程,将结果添加到队列中,并让 Solr 提交过程随着队列的增长而执行——所有内容都以几个更大的批次提交给 Solr(例如一次 1000 个文档)。
这还允许您扩展索引过程,而无需添加更多 Solr 服务器来使该部分过程运行得更快(如果您的 Solr 节点可以跟上搜索流量,则不需要扩展它只是为了处理文件)。
手动使用 Tika 还可以更轻松地在处理过程中更正或更改细节,例如文件格式返回不同时区的日期等。