<?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>Stiod Blog &#187; Xapian</title>
	<atom:link href="http://blog.stiod.com/category/xapian/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.stiod.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Mon, 22 Feb 2010 14:20:16 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Como extrair o conteúdo de um arquivo rpm?</title>
		<link>http://blog.stiod.com/2009/03/16/como-extrair-o-conteudo-de-um-arquivo-rpm/</link>
		<comments>http://blog.stiod.com/2009/03/16/como-extrair-o-conteudo-de-um-arquivo-rpm/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 01:16:13 +0000</pubDate>
		<dc:creator>Gabriel Verta</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Xapian]]></category>
		<category><![CDATA[extract]]></category>
		<category><![CDATA[rpm]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://blog.stiod.com/?p=306</guid>
		<description><![CDATA[O comando que extrai todo o conteudo de um arquivo rpm, criando as pastas que o rpm criaria a partir do diretório atual:
rpm2cpio arquivo.rpm &#124; cpio -idmv
  

Link sobre cpio
]]></description>
			<content:encoded><![CDATA[<p>O comando que extrai todo o conteudo de um arquivo rpm, criando as pastas que o rpm criaria a partir do diretório atual:</p>
<p><code>rpm2cpio arquivo.rpm | cpio -idmv</code><br />
 <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>
<a href="http://www.gnu.org/software/cpio/">Link sobre cpio</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2009/03/16/como-extrair-o-conteudo-de-um-arquivo-rpm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Djapian &#8211; Search API for Django with Xapian</title>
		<link>http://blog.stiod.com/2008/11/19/djapian-search-api-for-django-with-xapian/</link>
		<comments>http://blog.stiod.com/2008/11/19/djapian-search-api-for-django-with-xapian/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 17:57:40 +0000</pubDate>
		<dc:creator>caio</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Xapian]]></category>
		<category><![CDATA[djapian xapian django api search]]></category>

		<guid isPermaLink="false">http://blog.stiod.com/?p=157</guid>
		<description><![CDATA[Criamos uma página para o projeto Djapian.
\o/

Para quem não conhece, o Djapian, é um aplicativo que você pode incorporar à sua própria solução afim de permitir buscas nos textos, essencial em aplicativos como: Wiki, Blog, CMS e todo tipo de projeto que envolva colaboração de usuários em informação.
Acesse esse post para ver um artigo completo [...]]]></description>
			<content:encoded><![CDATA[<p>Criamos uma página para o projeto <strong><a href="http://www.djapian.com">Djapian.</a></strong></p>
<p>\o/</p>
<p style="text-align: center;"><img src="http://caio.stiod.com/blog2.png" width="100%" alt="Djapian - Search API for Django with Xapian " /></p>
<p>Para quem não conhece, o <strong>Djapian</strong>, é um aplicativo que você pode incorporar à sua própria solução afim de permitir buscas nos textos, essencial em aplicativos como: Wiki, Blog, CMS e todo tipo de projeto que envolva colaboração de usuários em informação.</p>
<p>Acesse <a href="http://blog.stiod.com/2007/08/25/djapian-solucao-de-search-engine-para-seu-projeto/">esse post</a> para ver um artigo completo sobre o <strong>Djapian</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2008/11/19/djapian-search-api-for-django-with-xapian/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Djapian: solução de search engine para seu projeto</title>
		<link>http://blog.stiod.com/2007/08/25/djapian-solucao-de-search-engine-para-seu-projeto/</link>
		<comments>http://blog.stiod.com/2007/08/25/djapian-solucao-de-search-engine-para-seu-projeto/#comments</comments>
		<pubDate>Sat, 25 Aug 2007 19:09:34 +0000</pubDate>
		<dc:creator>Rafael Sierra</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Xapian]]></category>

		<guid isPermaLink="false">http://blog.stiod.com.br/?p=37</guid>
		<description><![CDATA[Voltando a ser "on-topic" dessa vez vou falar de um projeto que desenvolvi junto com os outros integrantes desse blog: Djapian
Esse projeto é um aplicativo que você pode incorporar à sua própria solução afim de permitir buscas nos textos, ele é essencial em aplicativos como: Wiki, Blog, CMS e todo tipo de projeto que envolva [...]]]></description>
			<content:encoded><![CDATA[<p>Voltando a ser "on-topic" dessa vez vou falar de um projeto que desenvolvi junto com os outros integrantes desse blog: <a href="http://code.google.com/p/djapian">Djapian</a></p>
<p>Esse projeto é um aplicativo que você pode incorporar à sua própria solução afim de permitir <a href="http://en.wikipedia.org/wiki/Full_text_search">buscas nos textos</a>, ele é essencial em aplicativos como: Wiki, Blog, CMS e todo tipo de projeto que envolva colaboração de usuários em informação.<br />
<span id="more-29"></span><br />
Bom, vamos ao que interessa, que é como usar o Djapian.</p>
<p>Antes de mais nada instale o Xapian, suas bindings e o Djapian, um bom tutorial de como fazer isso pode ser encontrado <a href="http://code.google.com/p/djapian/wiki/InstallingXapian">aqui</a>.</p>
<p>Não esqueça que você precisa do <a href="http://djangoproject.com">Django</a> instalado também, aqui uso a versão 0.96.</p>
<p>Criaremos um projeto simples, só para exemplificar, com apenas um aplicativo e um modelo:</p>
<p><code><br />
$ django-admin.py start app teste<br />
$ cd teste<br />
$ python manage.py startapp app<br />
</code></p>
<p>Agora edite o arquivo settings.py para configurar sua base de dados e colocar o aplicativo "teste.app" e o "djapian" na lista dos INSTALLED_APPS, no meu caso vou usar o sqlite mesmo pra não perder tempo no postgresql</p>
<p>Edite o arquivo teste/app/models.py e deixe-o da seguinte forma:<br />
[python]<br />
# -*- encoding: utf-8 -*-<br />
'''<br />
Esse arquivo é auto-explicativo com varios comentarios para facilitar o<br />
entendimento de como funciona e o que significa cada parte do código</p>
<p>Algumas informações sobre o Xapian não explicitas aqui (como o que são prefixos)<br />
podem ser encontrados em:</p>
<p>http://blog.stiod.com.br/?p=5<br />
http://blog.stiod.com.br/?p=6</p>
<p>'''<br />
from django.db import models</p>
<p>#<br />
# O Change é o objeto que você deve criar sempre que ocorrer uma mudança no seu<br />
# próprio objeto<br />
#<br />
from djapian.models import Change</p>
<p>#<br />
# XapianIndexer é o objeto que usamos para fazer buscas e indexações<br />
#<br />
from djapian.backend.backends import XapianIndexer</p>
<p>#<br />
# Esse é o modelo que vamos indexar<br />
#<br />
class Modelo(models.Model):<br />
    titulo = models.CharField(maxlength=100)<br />
    corpo = models.TextField()<br />
    #<br />
    # Esse modulo é usado pelo Change pra saber qual é a instancia do<br />
    # XapianIndexer que está sendo usada por esse modulo, talvez isso no futuro<br />
    # seja substituido por algo mais digno, como GenericRelation ou objeto<br />
    # estatico, veremos <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
    #<br />
    index_model = 'teste.app.models.Modelo_index'</p>
<p>    #<br />
    # Precisamos sobrescrever o metodo save pra que sempre que o objeto for<br />
    # gravado (seja um novo, ou apenas alterado) seja criado uma alteração na<br />
    # fila do Change<br />
    #<br />
    def save(self):<br />
        # Primeiro nós salvamos o objeto pra evitar perda de informação<br />
        super(Modelo, self).save()<br />
        #<br />
        # Depois criamos o objeto e informamos qual o modelo e ID e em seguida<br />
        # salvamos o objeto, isso tudo poderia ser uma linha só, como foi feito<br />
        # na função delete() logo abaixo<br />
        #<br />
        new_change = Change()<br />
        new_change.model = self.index_model<br />
        new_change.did = self.id<br />
        new_change.save()</p>
<p>    #<br />
    # Da mesma forma que informamos que um objeto foi criado ou alterado,<br />
    # precisamos informar que um objeto foi removido, afinal, não queremos<br />
    # resultados "fantasmas"<br />
    #<br />
    def delete(self):<br />
        # Essa é a versão resumida do código usado na função save, com a<br />
        # resalva que no save não usamos o "is_deleted"<br />
        Change(did=self.id, model=self.index_model, is_deleted=True).save()<br />
        # Repare que agora nós deletamos *depois* de criar o Change, isso pra<br />
        # evitar perder o id deste objeto (ainda não testei deletar antes e ver<br />
        # o que acontece)<br />
        super(Test, self).delete()</p>
<p>#<br />
# Aqui é a parte mais importante da indexação, onde definimos o que e onde<br />
# iremos indexar<br />
#<br />
Modelo_index = XapianIndexer(<br />
                        #<br />
                        # Esse primeiro argumento define onde a base de dados do<br />
                        # XAPIAN deve ser criada ou usada se já existir, NUNCA<br />
                        # use o diretório /tmp sem a presença de um adulto isso<br />
                        # pode (e irá) trazer graves consequencias ao seu<br />
                        # projeto<br />
                        #<br />
                        '/tmp/db_modelo/',</p>
<p>                        #<br />
                        # O segundo argumento especifica qual modelo deve ser<br />
                        # indexado, isso permite que você tenha varias<br />
                        # instancias do XapianIndexer, uma para cada modelo do<br />
                        # seu aplicativo que precise ser indexado<br />
                        #<br />
                        Modelo,</p>
<p>                        #<br />
                        # No terceiro argumento informamos quais serão os campos<br />
                        # a serem indexados SEM prefixo<br />
                        #<br />
                        ['Modelo.titulo', 'Modelo.corpo'],</p>
<p>                        #<br />
                        # Por ultimo, mas, não menos importante vem os campos a<br />
                        # serem indexados COM prefixo, o prefixo ser a chave do<br />
                        # dicionário<br />
                        #<br />
                        {<br />
                            'titulo':'Modelo.titulo',<br />
                        }<br />
)</p>
<p>[/python]</p>
<p>Isso é tudo que você precisa fazer para configurar seu projeto para rodar com o Djapian, depois disso basta rodar o aplicativo "run_djapian.py" que foi instalado durante a instalação do Djapian, mas note que você precisará exportar a variavel DJANGO_SETTINGS_MODULE para "teste.settings", bem como ter o diretório do projeto no seu PYTHONPATH.</p>
<p>Como o foco deste post é mostar o backend da busca, eu não vou fazer nenhuma view, vou apenas usar o proprio shell do python, considero também que você já rodou o `syncdb`, para esse teste eu também exportei a variável de ambiente XAPIAN_FLUSH_THRESHOLD[1] para 10:</p>
<p>[python]<br />
from teste.app.models import Modelo<br />
for x in xrange(100):<br />
    Modelo(titulo='titulo numero %d'%x, corpo = 'corpo numero %d'%x).save()</p>
<p>from teste.app.models import Modelo_index<br />
resultados = Modelo_index.search('titulo')<br />
len(resultados)<br />
resultados = Modelo_index.search('titulo:10')<br />
len(resultados)<br />
for resultado in resultados:<br />
    print resultado.get_object()<br />
[/python]</p>
<p>Bom, isso é só um exemplo do básico, existem mais funcionalidades (como um módulo de tratamento de texto e remoção de acentos) junto do Djapian, mas eu preciso de ajuda pra documentar e deixar o projeto com cara de "projeto", se você acha que pode ajudar, please, let me know, toda ajuda é bem vinda, assim como se você acha que pode melhorar alguma coisa ou mesmo já fez um patch pro Djapian me envie que eu posso te adicionar como contribuidor do projeto e aplicarei o patch no fonte.</p>
<p>[1] - A variável XAPIAN_FLUSH_THRESHOLD é usada pelo core do Xapian para saber de quantos em quantos documentos ele deve fazer o flush das informações para a base de dados, se ela não for exportada o padrão é 10000, mas use-a com moderação <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2007/08/25/djapian-solucao-de-search-engine-para-seu-projeto/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
