我有一个拥有数百万条记录的核心。
我想添加一个自定义处理程序,它扫描现有文档并根据条件(例如年龄> 12)更新其中一个字段。
我更喜欢在 Solr 服务器端这样做,以避免向客户端发送数百万个文档并返回。
我正在考虑编写一个 solr 插件,它将接收查询并更新查询文档上的某些字段(例如查询处理程序的删除)。
我想知道是否有现有的解决方案或更好的替代方案。
我在网上搜索了一段时间,找不到更新文档的 Solr 插件示例(我不需要扩展更新处理程序)。
我编写了一个插件,它使用以下代码,它工作正常,但没有我需要的那么快。
目前我做:
AddUpdateCommand addUpdateCommand = new AddUpdateCommand(solrQueryRequest);
DocIterator iterator = docList.iterator();
SolrIndexSearcher indexReader = solrQueryRequest.getSearcher();
while (iterator.hasNext()) {
Document document = indexReader.doc(iterator.nextDoc());
SolrInputDocument solrInputDocument = new SolrInputDocument();
addUpdateCommand.clear();
addUpdateCommand.solrDoc = solrInputDocument;
addUpdateCommand.solrDoc.setField("id", document.get("id"));
addUpdateCommand.solrDoc.setField("my_updated_field", new_value);
updateRequestProcessor.processAdd(addUpdateCommand);
}
但这非常昂贵,因为更新处理程序将再次获取我手头已有的文档。
是否有一种安全的方法来更新 lucene 文档并将其写回,同时考虑所有与 Solr 相关的代码,例如缓存、额外的 solr 逻辑等?
我正在考虑将其转换为 SolrInputDocument,然后通过 Solr 添加文档,但我需要首先转换所有字段。
提前致谢, 阿夫纳