Turbinando o DataImportHandler com o ScriptTransformer

Em um dos projetos em que trabalhei, foi necessário mais do que simplesmente fazer a importação dos dados do repositório principal para o Solr, em muitos casos tivemos que tratar os campos antes de serem enviados.

Fora as discussões de “em qual camada da aplicação estes dados devem ser tratados”, alguns deles foram modificados em tempo de indexação. E não existe lugar melhor para fazer do que no DataImportHandler.

Existem várias maneiras de se tratar os dados no DIH. Um deles é com o TemplateTransformer, que utilizamos da seguinte forma (no caso abaixo estou utilizando um FileListEntityProcessor com um XPathEntityProcessor):

<entity name="x" processor="XPathEntityProcessor" forEach="/SEU/XPATH/AQUI" url="${f.fileAbsolutePath}" transformer="TemplateTransformer">

...

<field column="seucampo" template="${x.campoorigem} texto fixo" />

Isso fará com que o campo “seu campo” tenha o valor de “teste texto fixo” quando o valor do campo origem for “teste”.

E a maneira mais flexível (e complexa) de alterar um registro em tempo de indexação é com a utilização de scripts no DIH. Para isso, o primeiro passo é incluir a chamada ao script em seu “entity”:

<entity name="x" processor="XPathEntityProcessor" forEach="/SEU/XPATH/AQUI" url="${f.fileAbsolutePath}" transformer="TemplateTransformer,script:SuaFuncao">...

Após isso, você insere a sua tag script após a abertura da tag dataConfig, recebendo um parâmetro para o registro que você está trabalhando, relacionado ao entity corrente (o script será executado uma vez para cada registro) e com o nome definido um passo atrás, como eu fiz no exemplo abaixo:

<script>
<![CDATA[
function SuaFuncao(linha) {
return linha
}
]]>
</script>

E então, dentro deste script existem várias coisas que podem ser feitas, avalie o simples exemplo abaixo, basta apenas um pouco de conhecimento de javascript:


<script>
<![CDATA[
function SuaFuncao(linha) {

var textoManual = new java.util.ArrayList();
var campo1 = linha.get("campo1");
var campo2 = linha.get("campo2");
var suites = linha.get("suites");
var vagas = linha.get("vagas");
var tipooferta = linha.get("tipooferta");

if (campo1 != null)
textoManual.add(campo1 + " descrição do campo");

if (campo2 == "teste" || campo2 == "aquivai")
textoManual.add(campo2);

//Adicionar uma palavra fixa
textoManual.add("palavra-para-todos-os-campos");

linha.put("textomanual", textoManual);
return linha;

}
]]>
</script>

Com um pouco mais de imaginação dá para fazer muitas coisas legais. Para saber um pouco mais sobre o ScriptTransformer, visite o site oficial: http://wiki.apache.org/solr/

Bem galera, é isso, qualquer dúvida, estou à disposição.

Paz!

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s