如何使用自定义处理程序/插件更新Solr服务器端的Solr文档

Avn*_*evy 5 solr solr4

我有一个拥有数百万条记录的核心.
我想添加一个自定义处理程序,它扫描现有文档并根据条件更新其中一个字段(例如,年龄> 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); 
} 
Run Code Online (Sandbox Code Playgroud)

但这是非常昂贵的,因为更新处理程序将再次获取我已经掌握的文档.
是否有一种安全的方法来更新lucene文档并将其写回来,同时考虑所有与Solr相关的代码,如缓存,额外的solr逻辑等?
我想将它转换为SolrInputDocument,然后只需通过Solr添加文档,但我需要先转换所有字段.
先谢谢,Avner

pha*_*ani 0

我不确定以下内容是否会提高性能,但认为它可能对您有帮助。

看看SolrEntityProcessor

它的描述听起来与您正在搜索的内容非常相关。

This EntityProcessor imports data from different Solr instances and cores. 
The data is retrieved based on a specified (filter) query. 
This EntityProcessor is useful in cases you want to copy your Solr index 
and slightly want to modify the data in the target index. 
In some cases Solr might be the only place were all data is available.
Run Code Online (Sandbox Code Playgroud)

但是,我找不到开箱即用的功能来嵌入您的逻辑。所以,你可能需要扩展下面的课程。

SolrEntityProcessor和源代码的链接

您可能知道,但还有其他几点。

1)使整个进程利用所有可用的CPU核心。使其成为多线程。

2)使用最新版本的Solr。

3) 在不同的机器上以最小的网络延迟试验两个 Solr 应用程序。这将是一个艰难的决定:

same machine, two processes VS two machines, more cores, but network overhead.
Run Code Online (Sandbox Code Playgroud)

4)以适用于您的用例和特定实现的方式调整Solr 缓存。

5) 更多资源:Solr Performance ProblemsSolrPerformanceFactors

希望能帮助到你。尽管有这个答案,还是让我知道统计数据。我很好奇,你的信息可能会对以后的人有所帮助。