<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Lucas Teixeira &#187; indexação</title>
	<atom:link href="http://lucastex.com.br/tag/indexacao/feed/" rel="self" type="application/rss+xml" />
	<link>http://lucastex.com.br</link>
	<description>@lucastex</description>
	<lastBuildDate>Mon, 19 Jul 2010 11:39:24 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Usando JNDI na configuração do DataImportHandler</title>
		<link>http://lucastex.com.br/2010/01/18/usando-jndi-na-configuracao-do-dataimporthandler/</link>
		<comments>http://lucastex.com.br/2010/01/18/usando-jndi-na-configuracao-do-dataimporthandler/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 11:27:03 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[dataimporthandler]]></category>
		<category><![CDATA[dica]]></category>
		<category><![CDATA[indexação]]></category>
		<category><![CDATA[jndi]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=254</guid>
		<description><![CDATA[

Quer evitar que suas credenciais (usuário e senha) estejam abertas no seu data-config.xml? A melhor alternativa com certeza é usar um datasource JNDI para isso e manter usuário, senha e url de conexão do banco de dados dentro do cointainer.
Para isso, é só declarar a tag dataSource do data-config.xml desta maneira:
&#60;dataSource user=&#34;&#34; password=&#34;&#34; jndiName=&#34;JndiDoMeuDs&#34;
Sim, os [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2010%252F01%252F18%252Fusando-jndi-na-configuracao-do-dataimporthandler%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2F5PuEzp%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Usando%20JNDI%20na%20configura%C3%A7%C3%A3o%20do%20DataImportHandler%22%20%7D);"></div>
<p>Quer evitar que suas credenciais (usuário e senha) estejam abertas no seu <strong>data-config.xml</strong>? A melhor alternativa com certeza é usar um datasource JNDI para isso e manter usuário, senha e url de conexão do banco de dados dentro do cointainer.</p>
<p>Para isso, é só declarar a tag <strong>dataSource</strong> do <strong>data-config.xml</strong> desta maneira:</p>
<pre class="brush: xml;">&lt;dataSource user=&quot;&quot; password=&quot;&quot; jndiName=&quot;JndiDoMeuDs&quot;</pre>
<p>Sim, os parametros <strong>user</strong> e <strong>password</strong> devem ser declados vazios, não se esqueça disso.</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/01/18/usando-jndi-na-configuracao-do-dataimporthandler/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Indexando vários campos com o mesmo conteúdo</title>
		<link>http://lucastex.com.br/2009/12/15/indexando-varios-campos-com-o-mesmo-conteudo/</link>
		<comments>http://lucastex.com.br/2009/12/15/indexando-varios-campos-com-o-mesmo-conteudo/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 18:15:22 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[field]]></category>
		<category><![CDATA[indexação]]></category>
		<category><![CDATA[schema]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=201</guid>
		<description><![CDATA[

Durante a definição schema do seu índice SOLR, muitas vezes precisamos armazenar o mesmo valor em diferentes campos (fields). Isto é necessário pelo fato de que cada field tem sua maneira de ser indexado, impactando diretamente no match deste documento em uma busca.
Por exemplo, temos o nome de um livro no nosso índice da biblioteca. [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2009%252F12%252F15%252Findexando-varios-campos-com-o-mesmo-conteudo%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Indexando%20v%C3%A1rios%20campos%20com%20o%20mesmo%20conte%C3%BAdo%22%20%7D);"></div>
<p>Durante a definição schema do seu índice SOLR, muitas vezes precisamos armazenar o mesmo valor em diferentes campos (fields). Isto é necessário pelo fato de que cada field tem sua maneira de ser indexado, impactando diretamente no match deste documento em uma busca.</p>
<p>Por exemplo, temos o nome de um livro no nosso índice da biblioteca. Este nome deve ser flexionado no maior número possível de formas para que seja encontrado, seja removendo acentos, usando o snowball, o tokenizando e etc. Porém, ele também será usado em uma feature de &#8220;ordenação alfabética&#8221;. Neste caso sabemos que o campo deve ser indexado como &#8220;string&#8221; sem tokenização ou flexão, ou o resultado pode virar uma bagunça.</p>
<p>Grande parte das pessoas, enviam o campo duas vezes para o Solr, em dois fields diferentes, por exemplo: &#8220;nome&#8221; e &#8220;nome_ord&#8221;. Com isso, deixamos de usar uma diretriz bem bacana do solr chamada <strong>copyField</strong> que serve para copiar o conteúdo de um campo para outro.</p>
<p>Imaginando que os campos estejam definidos da seguinte forma:</p>
<pre class="brush: xml;">&lt;field name=&quot;nome&quot; type=&quot;text&quot; indexed=&quot;true&quot; stored=&quot;true&quot; /&gt;
&lt;field name=&quot;nome_ord&quot; type=&quot;string&quot; indexed=&quot;true&quot; stored=&quot;false&quot; /&gt;</pre>
<p>E usar no fim do documento a instrução <strong>copyField</strong></p>
<pre class="brush: xml;">&lt;copyField source=&quot;nome&quot; dest=&quot;nome_ord&quot; /&gt;</pre>
<p>Desta forma não adicionamos nenhum overhead de parse de uma nova informação, diminuímos a quantidade de dados enviada para o Solr (muito importante se estiver usando HTTP para indexação) e garantimos que a informação será exatamente a mesma.</p>
<p>Uma outra funcionalidade (esta disponível apenas a partir do Solr 1.4) é o <strong>maxChars </strong>que pode ser usado para restringir a quantidade de caracteres que serão copiados. Neste meu exemplo poderia ser usado para criar um resumo da introdução desta maneira.</p>
<pre class="brush: xml;">&lt;copyField source=&quot;introducao&quot; dest=&quot;resumo&quot; maxChars=&quot;3000&quot; /&gt;</pre>
<p>Boa!</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/12/15/indexando-varios-campos-com-o-mesmo-conteudo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Solr 1.4 &#8211; Feito o lançamento oficial</title>
		<link>http://lucastex.com.br/2009/11/10/solr-1-4-feito-o-lancamento-oficial/</link>
		<comments>http://lucastex.com.br/2009/11/10/solr-1-4-feito-o-lancamento-oficial/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 16:12:51 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[indexação]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=181</guid>
		<description><![CDATA[

Bom pessoal, como disse no post anterior, hoje foi lançado o Solr 1.4 versão final.
O link para download é: http://linorg.usp.br/apache/lucene/solr/1.4.0/
Segue abaixo o e-mail oficial de lançamento, que acabou de cair na Lista de e-mails do framework, enviado pelo Grant Ingersoll.
Apache Solr 1.4 has been released and is now available for public download!
http://www.apache.org/dyn/closer.cgi/lucene/solr/
Solr is the popular, [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2009%252F11%252F10%252Fsolr-1-4-feito-o-lancamento-oficial%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Solr%201.4%20-%20Feito%20o%20lan%C3%A7amento%20oficial%22%20%7D);"></div>
<p>Bom pessoal, como disse no post anterior, hoje foi lançado o Solr 1.4 versão final.</p>
<p>O link para download é: <a href="http://linorg.usp.br/apache/lucene/solr/1.4.0/">http://linorg.usp.br/apache/lucene/solr/1.4.0/</a></p>
<p>Segue abaixo o e-mail oficial de lançamento, que acabou de cair na <a href="http://lucene.apache.org/solr/mailing_lists.html#Users" target="_blank">Lista de e-mails do framework</a>, enviado pelo <a href="http://lucene.grantingersoll.com/2009/11/10/apache-solr-1-4-0-offically-released/" target="_blank">Grant Ingersoll</a>.</p>
<blockquote><p>Apache Solr 1.4 has been released and is now available for public download!<br />
<a style="color: #074d8f;" href="http://www.apache.org/dyn/closer.cgi/lucene/solr/" target="_blank">http://www.apache.org/dyn/closer.cgi/lucene/solr/</a></p>
<p>Solr is the popular, blazing fast open source enterprise search<br />
platform from the Apache Lucene project.  Its major features include<br />
powerful full-text search, hit highlighting, faceted search, dynamic<br />
clustering, database integration, and rich document (e.g., Word, PDF)<br />
handling.  Solr is highly scalable, providing distributed search and<br />
index replication, and it powers the search and navigation features of<br />
many of the world&#8217;s largest internet sites.</p>
<p>Solr is written in Java and runs as a standalone full-text search server<br />
within a servlet container such as Tomcat.  Solr uses the Lucene Java<br />
search library at its core for full-text indexing and search, and has<br />
REST-like HTTP/XML and JSON APIs that make it easy to use from virtually<br />
any programming language.  Solr&#8217;s powerful external configuration allows it to<br />
be tailored to almost any type of application without Java coding, and<br />
it has an extensive plugin architecture when more advanced<br />
customization is required.</p>
<p>New Solr 1.4 features include<br />
- Major performance enhancements in indexing, searching, and faceting<br />
- Revamped all-Java index replication that&#8217;s simple to configure and<br />
can replicate config files<br />
- Greatly improved database integration via the DataImportHandler<br />
- Rich document processing (Word, PDF, HTML) via Apache Tika<br />
- Dynamic search results clustering via Carrot2<br />
- Multi-select faceting (support for multiple items in a single<br />
category to be selected)<br />
- Many powerful query enhancements, including ranges over arbitrary<br />
functions, and nested queries of different syntaxes<br />
- Many other plugins including Terms for auto-suggest, Statistics,<br />
TermVectors, Deduplication</p>
<p>Getting Started<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
New to Solr?  Follow the steps below to get up and running ASAP.</p>
<p>1. Download Solr at <a style="color: #074d8f;" href="http://www.apache.org/dyn/closer.cgi/lucene/solr/" target="_blank">http://www.apache.org/dyn/closer.cgi/lucene/solr/</a><br />
2. Check out the tutorial at <a style="color: #074d8f;" href="http://lucene.apache.org/solr/tutorial.html" target="_blank">http://lucene.apache.org/solr/tutorial.html</a><br />
3. Read the Solr wiki (<a style="color: #074d8f;" href="http://wiki.apache.org/solr" target="_blank">http://wiki.apache.org/solr</a>) to learn more<br />
4. Join the community by subscribing to <a style="color: #074d8f;" href="mailto:solr-user@lucene.apache.org" target="_blank">solr-user@lucene.apache.org</a><br />
5. Give Back (Optional, but encouraged!)  See <a style="color: #074d8f;" href="http://wiki.apache.org/solr/HowToContribute" target="_blank">http://wiki.apache.org/solr/HowToContribute</a></p>
<p>For more information on Apache Solr, see <a style="color: #074d8f;" href="http://lucene.apache.org/solr" target="_blank">http://lucene.apache.org/solr</a></p></blockquote>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/11/10/solr-1-4-feito-o-lancamento-oficial/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Solr 1.4, mais que pronto</title>
		<link>http://lucastex.com.br/2009/11/09/solr-1-4-mais-que-pronto/</link>
		<comments>http://lucastex.com.br/2009/11/09/solr-1-4-mais-que-pronto/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 00:37:13 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[busca]]></category>
		<category><![CDATA[indexação]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[search]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=173</guid>
		<description><![CDATA[

Pra quem acompanha a lista de discussões e o andamento do projeto, o Solr 1.4 já está prontinho para ser lançado tem algum tempo. O pessoal de dev estava apenas esperando o lançamento do Lucene 2.9 para oficializar o lançamento.
Quando então foi lançado, o pessoal do Solr empacotou o framework como RC, disponibilizou para download e [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2009%252F11%252F09%252Fsolr-1-4-mais-que-pronto%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Solr%201.4%2C%20mais%20que%20pronto%22%20%7D);"></div>
<p>Pra quem acompanha a lista de discussões e o andamento do projeto, o Solr 1.4 já está prontinho para ser lançado tem algum tempo. O pessoal de dev estava apenas esperando o lançamento do Lucene 2.9 para oficializar o lançamento.</p>
<p>Quando então foi lançado, o pessoal do Solr empacotou o framework como RC, disponibilizou para download e na hora do lançamento (pra ser mais preciso, um dia antes), dois bugs significativos foram levantados no Lucene 2.9. A equipe do Solr os avaliou com calma, entrou em alinhamento com os devs do Lucene (alguns fazem parte de ambas as equipes) e decidiram por bem aguardar o Lucene 2.9.1 para efetuar o anúncio oficial do Solr 1.4.</p>
<p>Pois bem, com <a href="http://lucene.apache.org/java/docs/index.html#6+November+2009+-+Lucene+Java+2.9.1+available">o lançamento oficial do Lucene 2.9.1 hoje a tarde</a>, o pessoal do Solr já correu, e empacotou em uma versão final a release tão esperada, 1.4.</p>
<p><a href="http://twitter.com/gsingers/status/5568639566" target="_self">Amanhã, dia 07, será feito o lançamento final do Solr 1.4 sem mais delongas</a>. Pois bem, é só aguardar! Mas se você quiser dar uma olhadinha antes, é só baixar os pacotes antes de serem replicados para o mirror central entrando aqui: <a href="http://people.apache.org/~gsingers/solr/1.4.0/" target="_blank">http://people.apache.org/~gsingers/solr/1.4.0/</a>.</p>
<p>Eu, em uma olhada muito, mas muito rápida por cima de algumas funcionalidades do Solr 1.4 (direto no wiki), levantei alguns pontos e encaminhei na lista de e-mails dos colaboradores da empresa em que trabalho. Não estão agrupados, muito menos organizados, mas segue como esboço e rascunho de um post que valeria a pena.</p>
<ul>
<li>SolrServer &#8211; SolrJ HTTP
<ul>
<li>Configuração
<ul>
<li>Timeout</li>
<li>Quantidade de retentativas</li>
</ul>
</li>
<li>SolrJ altamente evoluído para criação da queries e integrado aos searchcomponents</li>
</ul>
</li>
<li>DataImportHandler
<ul>
<li>Transformers
<ul>
<li>Clob Transformer: Permite pegar dados direto de colunas clob no banco de dados</li>
<li>HTML Stripper: Atua em campos com conteúdo HTML, removendo tags e deixando apenas o conteúdo</li>
</ul>
</li>
<li>Agora é possível usar o DIH indexando até conteúdos de um &#8216;datasource&#8217; de e-mail, deixando ele fazer pooling em um e-mail e indexando o que chega.</li>
<li>Eventos callback após indexação</li>
</ul>
</li>
<li>Replicação
<ul>
<li>Configuração interna a aplicação &#8211; Funciona como um RequestHandler</li>
<li>Dashboard de administração, permite ver como estão as replicações, qual indice está em cada nó, status do download de novos indices</li>
<li>Permite replicação interna, via HTTP, não sendo mais necessário usar apenas rsync
<ul>
<li>Com isso, possibilidade de usar em windows</li>
<li>Menos configuração de infra estrutura</li>
<li>Maior visibilidade do status da replicação</li>
</ul>
</li>
</ul>
</li>
<li>Indexação
<ul>
<li>indexação de grandes quantidades de documentos via streaming
<ul>
<li>conexão é aberta com o master, e permanece assim enquanto necessário.</li>
</ul>
</li>
<li>Anotação @Field para poder adicionar um POJO direto ao índice, sem ter que transformar em SolrInputDocument</li>
</ul>
</li>
<li>Componentes de busca (alguns presentes no 1.3 completos, outros eram beta, outros nem existiam)
<ul>
<li>Sugestão de busca</li>
<li>Spelling</li>
<li>Highlight</li>
</ul>
</li>
<li>Resposta da busca em vários novos formatos
<ul>
<li>php nativo</li>
<li>json (já existia mas não era oficial)</li>
<li>xml (normal)</li>
<li>ruby</li>
</ul>
</li>
</ul>
<p>E muito mais&#8230;</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/11/09/solr-1-4-mais-que-pronto/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Criando um Transformer customizado para o Solr</title>
		<link>http://lucastex.com.br/2009/10/26/criando-um-transformer-customizado-para-o-solr/</link>
		<comments>http://lucastex.com.br/2009/10/26/criando-um-transformer-customizado-para-o-solr/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 20:59:35 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[Solr]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[dataimporthandler]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[indexação]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=78</guid>
		<description><![CDATA[

Solr é um framework uma ferramenta para a construção de servidores de indexação e busca on top of índices lucene.
Possui todas as funcionalidades que existem em um sistema moderno de busca, como paginação, highlight de campos, flexão das palavras e etc. Na minha opinião, de tudo que trabalhei nos últimos anos, sem dúvida, formam o [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2009%252F10%252F26%252Fcriando-um-transformer-customizado-para-o-solr%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2F6Mg05M%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Criando%20um%20Transformer%20customizado%20para%20o%20Solr%22%20%7D);"></div>
<p><a href="http://lucene.apache.org/solr" target="_blank">Solr</a> é <span style="text-decoration: line-through;">um framework</span> uma ferramenta para a construção de servidores de indexação e busca <em>on top of</em> índices <a href="http://lucene.apache.org" target="_blank">lucene</a>.</p>
<p>Possui todas as funcionalidades que existem em um sistema moderno de busca, como paginação, highlight de campos, flexão das palavras e etc. Na minha opinião, de tudo que trabalhei nos últimos anos, sem dúvida, formam o conjunto mais poderoso de frameworks.</p>
<p>O Solr abstrai a camada Java do Lucene e disponibiliza uma interface http para a execução da consulta, fazendo com que fique <strong>muito</strong> fácil a integração com sistemas não-java.</p>
<p>Um dos recursos avançados de indexação com Solr são os <a href="http://wiki.apache.org/solr/DataImportHandler#Transformer" target="_blank">Transformers</a> a serem usados juntamente com o <a href="http://wiki.apache.org/solr/DataImportHandler">DataImportHandler</a>. Com eles, você pode processar o texto antes de ser indexado. (Um outro post sobre configuração básica de Solr e de DIH deve vir em breve).</p>
<p>Semana passada, precisei de um transformer que pudesse retirar todas as tags HTML do texto a ser indexado (malditos editores rich text em javascript). Como o projeto aqui está usando Solr 1.3 não tive a possibilidade de usar o <a href="http://wiki.apache.org/solr/DataImportHandler#HTMLStripTransformer" target="_blank">HTMLStripTransformer</a> que virá no Solr 1.4 (e está enroscado pra sair). Então acabei tendo que criar um semelhante para a funcionalidade.</p>
<p>A criação de transformers é muito simples (imho, simplista até demais, fazendo com que as vezes, o desenvolvedor se perca durante a implementação). Deve ser desenvolvida uma classe simples, que implementa um método com a seguinte assinatura:</p>
<pre class="brush: java;">public Map&lt;String, Object&gt; transformRow(Map&lt;String, Object&gt; aRow, Context context)</pre>
<p>Quando disse que é simplista demais, é pelo fato de que, (imho novamente), condições restritivas como esta deveriam estar documentadas em interfaces, mas não, quando necessário, o método é chamado via reflection, <a href="http://lucastex.com.br/wp-content/uploads/2009/10/1058unc.jpg" target="_blank">tendo certeza que ele está implementado</a>.</p>
<p>No meu caso, eu precisaria além de implementar o Transformer, deixar explícito no arquivo de configuração do DIH (<em>data-config.xml</em>) quais os campos que deveriam receber o tratamento desta tag, fiz isso adicionando a tag <strong>removeHtml</strong> no nó de cada campo (não, este xml não passa por validação).</p>
<pre class="brush: xml;">&lt;field name=&quot;txt&quot; column=&quot;texto&quot; removeHtml=&quot;true&quot; /&gt;</pre>
<p>Com isto, estamos deixando claro para o DIH que o valor que retornar da query na coluna <strong>texto</strong> será repassado ao Solr para indexação no field <strong>txt</strong> (definido no <em>schema.xml</em>) e terá processamento do meu HtmlTransformer. Ah, não podemos esquecer da declaração do transformer para a entidade:</p>
<pre class="brush: xml;">&lt;entity name=&quot;posts&quot; transformer=&quot;br.com.lucastex.dih.transformer.HtmlTransformer&quot; /&gt;</pre>
<p>Pronto, a classe está agora carregada e pronta para ser chamada quando um campo necessitar. Agora, vamos a implementação da classse. No meu caso, ela ficou bem trivial, pois o campo em questão nunca será multivalorado (ou seja, não preciso tratar a possibilidade do argumento ser um List, mas apenas uma String.</p>
<pre class="brush: java; gutter: true;">package br.com.lucastex.dih.transformer;

import java.util.Map;

import org.apache.commons.lang.StringEscapeUtils;
import org.apache.solr.handler.dataimport.Context;
import org.apache.solr.handler.dataimport.DataImporter;
import org.apache.solr.handler.dataimport.RegexTransformer;
import org.apache.solr.handler.dataimport.Transformer;

public class HtmlTransformer extends Transformer {

  public static final String TAG = &quot;removeHtml&quot;;

  public Map&lt;String, Object&gt; transformRow(Map&lt;String, Object&gt; aRow, Context context) {

    for (Map&lt;String, String&gt; map : context.getAllEntityFields()) {
      if (!Boolean.TRUE.toString().equals(map.get(TAG)))
        continue;
      String columnName = map.get(DataImporter.COLUMN);
      String sourceColumnName = map.get(RegexTransformer.SRC_COL_NAME);
      if (sourceColumnName == null)
        sourceColumnName = columnName;
      Object value = aRow.get(sourceColumnName);
      if (value instanceof String) {
        String result = stripHtml((String) value);
        aRow.put(columnName, result);
      }
    }
    return aRow;
  }

  private String stripHtml(String text) {
    try {
      String cleanText = StringEscapeUtils.unescapeHtml(text.replaceAll(&quot;\\&lt;.*?\\&gt;&quot;, &quot; &quot;));
      cleanText = cleanText.trim().replaceAll(&quot;\n&quot;,&quot; &quot;);
      cleanText = cleanText.replaceAll(&quot;\t&quot;,&quot; &quot;);
      cleanText = cleanText.replaceAll(&quot;[\\s]+&quot;, &quot; &quot;);
      return cleanText;
    } catch (Exception e) {
      //trata exception de acordo com seu contexto solr
    }
    return text;
  }
}</pre>
<p>Bom, o código é bem auto-explicativo. Basicamente recebe o além do contexto em execução do Solr/DIH, um Map de String e Object, que contém todos os campos e valores da linha que está sendo analisada/indexada no momento. Vale lembrar que este modelo de passagem de parâmetro é feito <strong>exatamente</strong> como descrito no <a href="http://desciclo.pedia.ws/wiki/Gambi_Design_Patterns#BCDR_Pattern">Pattern BCDR</a>.</p>
<p>Enfim, as linhas 18 e 19 garantem que o código só será executado para campos que tenham declarado a tag <strong>removeHtml=true</strong> como descrito anteriormente.</p>
<p>A linha 24 recupera o valor original do campo, ou seja, o que foi retornado pela query no banco de dados, e nas linhas 26 e 27 o resultado é tratado (através da chamada para o método stripHtml) e devolvida ao Map.</p>
<p>Ou seja, este é o momento onde você tem acesso a todos os campos que estão vindo do banco antes de irem ao índice. É nesta hora que você duplica seus campos, faz tratamentos, aplica padrões e templates, enfim trabalha a informação bruta original do banco de dados.</p>
<p>Já o método de remoção de tags HTML, não é nada além de um conjunto de regexes encadeadas  com uma ajudinha do StringEscapeUtils (<a href="http://lucastex.com.br/2009/10/25/maravilhas-do-groovy-a-propriedade-metaclass/" target="_blank">que saudade deste post</a>) do Commons-lang.</p>
<p>Simples como</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/10/26/criando-um-transformer-customizado-para-o-solr/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>
