Как добавить новое поле в документ в пользовательском фильтре Solr
Я пишу пользовательский фильтр в Solr для публикации токена в Apache Stanbol для улучшения и индексирования ответа на другое поле в том же документе.
В моем тестовом коде ниже я получил ответ Stanbol и добавил его в качестве нового документа в Solr. Мое требование - добавить stanbolResponse в качестве значения поля к тому же индексируемому документу. Я думаю, что это можно сделать, если я могу получить идентификатор документа из TokenStream в фильтре.
Может ли кто-нибудь помочь мне с примером кода / примера или ссылку на то, как этого добиться?
public boolean incrementToken() throws IOException {
if (!input.incrementToken()) {
return false;
}
int length = charTermAttr.length();
char[] buffer = charTermAttr.buffer();
String content = new String(buffer);
Client client = Client.create();
WebResource webResource = client.resource(stanbol_endpoint + "enhancer");
ClientResponse response = webResource
.type(MediaType.TEXT_PLAIN)
.accept(new MediaType("application", "rdf+xml"))
.entity(content2,MediaType.TEXT_PLAIN)
.post(ClientResponse.class);
int status = response.getStatus();
if (status != 200 && status != 201 && status != 202) {
throw new RuntimeException("Failed : HTTP error code : "
+ response.getStatus());
}
String output = response.getEntity(String.class);
charTermAttr.setEmpty();
char[] newBuffer = output.toCharArray();
charTermAttr.copyBuffer(newBuffer, 0, newBuffer.length);
SolrInputDocument doc1 = new SolrInputDocument();
doc1.addField( "id", "id1", 1.0f );
doc1.addField("stanbolResponse", output);
try {
server.add(doc1);
server.commit();
} catch (SolrServerException e) {
System.out.println("error while indexing response to solr");
e.printStackTrace();
}
return true;
}
1 ответ
Этот сценарий был успешно покрыт написанием пользовательского UpdateRequestProcessor и настройкой обработчика запроса /update для использования моего пользовательского процессора в update.chain.
Мне удалось обработать и добавить новые поля в документ до индексации. Ниже описано, как я сконфигурировал свой обработчик запросов /update с моим пользовательским процессором.
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>