如何在自定义Solr筛选器中向文档添加新字段

如何在自定义Solr筛选器中向文档添加新字段,solr,filter,solrj,apache-stanbol,Solr,Filter,Solrj,Apache Stanbol,我正在Solr中编写一个自定义过滤器,将令牌发布到ApacheStanbol以进行增强,并将响应索引到同一文档中的不同字段 在下面的测试代码中,我得到了Stanbol响应,并将其作为新文档添加到Solr中。我的要求是将stanbolResponse作为字段值添加到正在编制索引的同一文档中。 我认为如果我可以从过滤器中的TokenStream中检索文档Id,就可以做到这一点 有人能帮我提供一个示例代码/示例或一个如何实现这一点的链接吗 public boolean incrementToken()

我正在Solr中编写一个自定义过滤器,将令牌发布到ApacheStanbol以进行增强,并将响应索引到同一文档中的不同字段

在下面的测试代码中,我得到了Stanbol响应,并将其作为新文档添加到Solr中。我的要求是将stanbolResponse作为字段值添加到正在编制索引的同一文档中。 我认为如果我可以从过滤器中的TokenStream中检索文档Id,就可以做到这一点

有人能帮我提供一个示例代码/示例或一个如何实现这一点的链接吗

public boolean incrementToken()引发IOException{
如果(!input.incrementToken()){
返回false;
}
int length=charTermAttr.length();
char[]buffer=charTermAttr.buffer();
字符串内容=新字符串(缓冲区);
Client=Client.create();
WebResource=client.resource(stanbol_端点+“增强器”);
ClientResponse响应=webResource
.type(MediaType.TEXT\u PLAIN)
.accept(新媒体类型(“应用程序”、“rdf+xml”))
.entity(content2,MediaType.TEXT\u PLAIN)
.post(ClientResponse.class);
int status=response.getStatus();
如果(状态!=200&&status!=201&&status!=202){
抛出新的RuntimeException(“失败:HTTP错误代码:”
+response.getStatus());
}
字符串输出=response.getEntity(String.class);
charTermAttr.setEmpty();
char[]newBuffer=output.toCharArray();
charTermAttr.copyBuffer(newBuffer,0,newBuffer.length);
SolrInputDocument doc1=新的SolrInputDocument();
doc1.addField(“id”,“id1”,1.0f);
doc1.addField(“stanbolResponse”,输出);
试一试{
server.add(doc1);
commit();
}捕获(SolrServer异常){
System.out.println(“为solr的响应编制索引时出错”);
e、 printStackTrace();
}
返回true;
}

通过编写自定义UpdateRequestProcessor并在update.chain中配置/update请求处理程序以使用我的自定义处理器,成功地涵盖了此用例

在编制索引之前,我能够处理文档并向文档中添加新字段。 下面是我如何使用自定义处理器配置我的/update请求处理程序

stanbol进程的RequestProcessor:

<updateRequestProcessorChain name="stanbolInterceptor">
    <processor class="com.solr.stanbol.processor.StanbolContentProcessorFactory"/>
    <processor class="solr.RunUpdateProcessorFactory" />
</updateRequestProcessorChain>

为update.chain配置具有上述链的请求处理程序:

<requestHandler name="/update" class="solr.UpdateRequestHandler">
       <lst name="defaults">
         <str name="update.chain">stanbolInterceptor</str>
       </lst>
</requestHandler>

斯坦博尔拦截器

也许我误解了您的案例,但您不能简单地在分析之前创建一个UpdateRequestProcessor吗?你可以在你的处理器中做任何你想做的事情,然后将结果添加到文档中并通过普通的分析链传递。是的,这个用例通过编写一个UpdateRequestProcessor成功地覆盖了。