2013-11-12 2 views
0

Я пишу настраиваемый фильтр в Solr для отправки токена в Apache Stanbol для улучшения и индексации ответа на другое поле в том же документе.Как добавить новое поле в документ в пользовательский Solr-фильтр

В моем тестовом коде ниже у меня есть ответ 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; 
} 
+0

Может быть, я неправильно ваше дело, но вы не можете просто создать UpdateRequestProcessor предварительный анализ? Вы можете делать все, что хотите, в своем процессоре, а затем добавлять результат в документ и передавать его через обычную цепочку анализа. – lexk

+0

yep Lexk, этот usecase был успешно покрыт написанием UpdateRequestProcessor. –

ответ

0

Этот UseCase был успешно охватывается написания пользовательского UpdateRequestProcessor и настройки обработчика запросов/обновления, чтобы использовать свой собственный процессор в update.chain.

Я смог обработать и добавить новые поля в документ перед индексированием. Ниже описано, как я настроил обработчик запроса/обновления с помощью моего настраиваемого процессора.

RequestProcessor для процесса stanbol:

<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>