<?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; Solr</title>
	<atom:link href="http://lucastex.com.br/category/solr/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>[GSolr] Beans declarados automagicamente</title>
		<link>http://lucastex.com.br/2010/02/28/gsolr-beans-declarados-automagicamente/</link>
		<comments>http://lucastex.com.br/2010/02/28/gsolr-beans-declarados-automagicamente/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 02:18:23 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[GSolr]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Solr]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[Spring]]></category>

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

GSolr, é o nome do plugin de solr que estamos fazendo de solr para grails. Para quem quiser acompanhar o trabalho, o repositório está no github: http://github.com/lucastex/gsolr.
Uma coisa que já está feita é a leitura da configuração do gsolr e a declaração mágica de beans, um para cada servidor solr que estiver configurado. Exemplificando, vamos [...]]]></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%252F02%252F28%252Fgsolr-beans-declarados-automagicamente%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FccV24J%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%5BGSolr%5D%20Beans%20declarados%20automagicamente%22%20%7D);"></div>
<p>GSolr, é o nome do plugin de solr que estamos fazendo de solr para grails. Para quem quiser acompanhar o trabalho, o repositório está no github: <a href="http://github.com/lucastex/gsolr" target="_blank">http://github.com/lucastex/gsolr</a>.</p>
<p>Uma coisa que já está feita é a leitura da configuração do gsolr e a declaração <strong>mágica</strong> de beans, um para cada servidor solr que estiver configurado. Exemplificando, vamos imaginar que a configuração esteja declarando três servidores Solr que serão consultados:</p>
<pre class="brush: groovy;">gsolr {
   solr {
      produtos {
         (...)
      }
      noticias {
         (...)
      }
      usuarios {
         (...)
      }
   }
}</pre>
<p>Particularmente, achei bem interessante usar o nome da closure para o nome do servidor ao invés de termos um atributo <em>name = produtos</em> :)<br />
A mágica legal mesmo, é que o plugin vai ler esta configuração quando a aplicação for para o ar, e depois disso irá declarar / criar beans spring dinâmicamente, usando a Spring DSL. E os beans vão ter no nome a declaração feita na closure do usuário.</p>
<p>Ou seja, para os servidores <strong>solr</strong> declarados acima, o plugin irá declarar os Spring Beans <strong>produtosGSolr</strong>, <strong>noticiasGSolr</strong> e <strong>usuariosGSolr</strong> .</p>
<p>Desta maneira, vamos garantir que se você quiser o usar o plugin, o processo como um todo ficará o menos intrusivo possível, e você poderá usar os métodos (de pesquisa e outros) do GSolr apenas injetando o bean do servidor Solr que você quiser.</p>
<pre class="brush: groovy;">class PesquisaService {
   def noticiasGSolr

   def pesquisar = {
      (...)
   }
}</pre>
<p>Achei no mínimo, muito prático. Tudo isso graças a Spring DSL que temos em groovy. Com um pouco mais de tempo, coloco o procedimento passo a passo para declarar os beans desta maneira. Enquanto isso, conheça um pouco mais sobre a <a href="http://grails.org/doc/latest/guide/14.%20Grails%20and%20Spring.html#14.4%20The%20BeanBuilder%20DSL%20Explained" target="_blank">Spring DSL aqui</a>, ou veja o código fonte <a href="http://github.com/lucastex/gsolr/blob/master/GsolrGrailsPlugin.groovy" target="_blank">aqui</a> e também <a href="http://github.com/lucastex/gsolr/blob/master/src/groovy/org/gsolr/core/GSolrConfigParser.groovy" target="_blank">aqui</a>.</p>
<p>Tem alguma idéia ou sugestão para o plugin? Deixe um comentário!</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/02/28/gsolr-beans-declarados-automagicamente/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Grails e Solr juntos, o melhor dos mundos</title>
		<link>http://lucastex.com.br/2010/02/26/grails-e-solr-juntos-o-melhor-dos-mundos/</link>
		<comments>http://lucastex.com.br/2010/02/26/grails-e-solr-juntos-o-melhor-dos-mundos/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 18:11:42 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[Solr]]></category>
		<category><![CDATA[nabble]]></category>
		<category><![CDATA[plugin]]></category>

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

Tá rolando uma discussão legal na lista &#8220;grails-users&#8221; sobre Solr.
Estamos levantando alguns pontos que seriam essenciais e interessantes para um plugin grails que cuidasse disso. Se você gosta também de Solr, ou está interessado, acompanhe os e-mails na Grails-Users ou no nabble aqui.
Você usa solr? O que acha interessante nele que deva existir em um [...]]]></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%252F02%252F26%252Fgrails-e-solr-juntos-o-melhor-dos-mundos%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2F9RkqDd%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Grails%20e%20Solr%20juntos%2C%20o%20melhor%20dos%20mundos%22%20%7D);"></div>
<p>Tá rolando uma discussão legal na lista &#8220;grails-users&#8221; sobre Solr.</p>
<p>Estamos levantando alguns pontos que seriam essenciais e interessantes para um plugin grails que cuidasse disso. Se você gosta também de Solr, ou está interessado, acompanhe os e-mails na <a href="http://n4.nabble.com/Grails-user-f1312389.html" target="_blank">Grails-Users</a> ou no <a href="http://n4.nabble.com/Discussion-on-a-Grails-Solr-Plugin-td1569847.html" target="_blank">nabble aqui</a>.</p>
<p>Você usa solr? O que acha interessante nele que deva existir em um plugin grails?</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/02/26/grails-e-solr-juntos-o-melhor-dos-mundos/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<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>Apache Solr &#8211; Recomendação de livro</title>
		<link>http://lucastex.com.br/2010/01/15/apache-solr-recomendacao-de-livro/</link>
		<comments>http://lucastex.com.br/2010/01/15/apache-solr-recomendacao-de-livro/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 16:53:57 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Livros]]></category>
		<category><![CDATA[Solr]]></category>
		<category><![CDATA[indexa]]></category>
		<category><![CDATA[leitura]]></category>
		<category><![CDATA[livro]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[seach]]></category>

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

Pra quem gosta de busca e assuntos relacionados, um ótimo livro que recomendo é este: Solr 1.4 Enterprise Search Server.
Muito legal, bem abrangente, fala um pouco sobre cada coisa, desde implementações básicas necessárias de DataImportHandler, Transformers, Term-Suggest, Types e outros pontos.


Foi lançado um pouco antes da versão 1.4 estável sair (por todo aquele problema do [...]]]></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%252F15%252Fapache-solr-recomendacao-de-livro%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2F5sDKju%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Apache%20Solr%20-%20Recomenda%C3%A7%C3%A3o%20de%20livro%22%20%7D);"></div>
<p>Pra quem gosta de busca e assuntos relacionados, um ótimo livro que recomendo é este: <strong>Solr 1.4 Enterprise Search Server.</strong></p>
<p>Muito legal, bem abrangente, fala um pouco sobre cada coisa, desde implementações básicas necessárias de DataImportHandler, Transformers, Term-Suggest, Types e outros pontos.</p>
<p><center><br />
<div id="attachment_239" class="wp-caption alignnone" style="width: 210px"><img class="size-full wp-image-239" title="Solr 1.4 - Enterprise Search Server" src="http://lucastex.com.br/wp-content/uploads/2010/01/Solr-1-4-Enterprise-Search-Server.jpg" border="0" alt="Solr 1.4 - Enterprise Search Server" width="200" height="247" /><p class="wp-caption-text">Solr 1.4 - Enterprise Search Server</p></div><br />
</center></p>
<p>Foi lançado um pouco antes da versão 1.4 estável sair (por todo aquele problema do último bug do lucene e etc), por 2 dos committers: David Smiley e Eric Pugh.</p>
<p>Está custando $40 diretamente no packetpub: A url para o produto é esta: <a href="http://www.packtpub.com/solr-1-4-enterprise-search-server/book" target="_blank">http://www.packtpub.com/solr-1-4-enterprise-search-server/book</a>. </p>
<p>Recomendo a todos que se interessam pelo assunto, e trabalham com isso, guia de consulta imprescindível :)</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/01/15/apache-solr-recomendacao-de-livro/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>
