Janeiro 15th 2008 12:15 am

Busca no site? Com Zend_Search_Lucene claro!

O Zend_Search_Lucene é uma módulo do Zend Framework que serve para indexar strings, o módulo é baseado no projeto Apache Lucene porém portado para PHP. Com ele é possível indexar o conteúdo de seu site e depois executar consultas baseadas no índice criado.

Nestes ultimos dias andei dando uma olhada no componente, então resolvi postar aqui no blog o exemplo que adaptei da apresentação de Wil Sinclair sobre o módulo do framework.

Não vou explicar detalhes sobre a implementação aqui no blog, sendo que o que fiz foi praticamente um copy e paste do exemplo dado na apresentação, mas aos que tiverem dúvidas, basta comentar aqui no blog ou postar lá no fórum http://www.zfbrasil.com/forum/, posso tentar dar uma ajuda.

Aos que quiserem mais informações a respeito do Zend_Search_Lucene, a uma boa documentação disponível no manual do framework.
http://framework.zend.com/manual/en/zend.search.lucene.html

Obs.: No exemplo que deixei dispoível para download abaixo, a um crawler com a url do meu blog apontada. Peço aos que testarem, que não fiquem executando muitas vezes o script com a url do blog, se não vai acabar estourando a minha cota de tranferência :).

Os arquivos do exemplo : zfsearch.zip

Abraço a todos.

Compartilhe:
  • del.icio.us
  • Google
  • Digg
  • Sphinn
  • Facebook
  • Mixx
  • LinkedIn
  • Live
  • Rec6
  • Technorati
  • TwitThis
1 Estrela2 Estrela3 Estrela4 Estrela5 Estrela (1 votos, média: 5 de 5)
Loading ... Loading ...

20 Comments »

20 Responses to “Busca no site? Com Zend_Search_Lucene claro!”

  1. rics on 15 Jan 2008 at 08:33 #

    Cara,

    Faz um tempo já que eu estou dando uma olhada nos frameworks para investir meu tempo no aprendizado de algum deles. Não só pra agilizar o desenvolvimento de aplicações, mas também pra começar a desenvolver com mais consistência e tudo o mais. Enfim…

    Depois de muito pesquisar estou em dúvida entre investir meu tempo no CakePHP ou no Zend Framework.

    Queria saber o que você tem a dizer do Zend, e se você já experimentou o Cake seria legal ouvir tua opinião também.

  2. Eduardo Lira on 15 Jan 2008 at 12:13 #

    Olá cara.
    Estou estudando o Zend Framework a um tempinho.
    Agora estou com uma dúvida e se pudesse me ajudar seria muito grato.
    Seguinte estou fazendo algumas aplicações com o GData para manipulação das imagens no picasa. Estava querendo guardar informações dentro da foto, Exif. Tem a classe do Exif dentro do Zend Framework blz, mas assim estava querendo inserir informações que não seja padrão das fotos.
    Tipo criar alguns campos a mais como descrição da foto, cidade tirada a foto etc. É que estou fazendo umas aplicações o qual necessito inserir algumas informações dentro da foto fora Autor, Maquina, Foco, em fim fora as que tem como padrão.
    Seria possivel isso cara?
    A um tempo que venho procurando para utilizar no Zend Framework mas não acho e por ser muito novo o Zend Framework e poucos exemplos.

    Novamente, agradeceria muito se pudesse me ajudar, se não obrigado pela atenção.

    Abraços.

  3. Fábio on 15 Jan 2008 at 15:44 #

    Olá..
    Usando o crawler que você colocou nos arquivos, indexei uma página única da internet e a busca não consegue encontrar todas as palavras do texto. Pq?

    Ficou assim:
    define ( ‘START_URI’, ‘http://www.csie.ntu.edu.tw/~b2506017/sf/lists.htm’ ) ;
    define ( ‘MATCH_URI’, ‘http://www.csie.ntu.edu.tw/~b2506017/sf/lists.htm’ ) ;

  4. Diego Tremper on 16 Jan 2008 at 22:00 #

    Fábio,

    não entendi tua pergunta, poderia dar um exemplo mais claro?

    Abraço

  5. Diego Tremper on 16 Jan 2008 at 22:22 #

    rics,

    “e se você já experimentou o Cake”?

    - não, infelismente nunca utilizei o CakePHP

    “Queria saber o que você tem a dizer do Zend”?

    - Então… O Zend Framwork é distribuido pela “The PHP Company” o que produz uma melhor imagem em relação a outros frameworks existentes; a Zend presta consultoria e outros serviços; isso, para empresas de grande porte, realmente faz a diferença na hora de adotar um framework. Como provavelmente acontece com outros frameworks, o desenvolvimento é mantido pela comunidade do PHP, no caso do Zend Framework, gosto de como as coisas passam ou não a fazer parte do framework, o processo de aprovação de novas idéias para o framework é muito seletivo, todos da comunidade podem opinar sugerir mudanças/melhorias, criticar, etc, todos os componentes são minuciosamente revisados antes de fazerem parte do framework, a cobertura de testes do código é muito eficaz, entre outras coisas.

    A um wiki, para colaboradores/usuários do framework, se for do seu interesse dar uma olhada, ai vai o link, http://framework.zend.com/wiki/display/ZFDEV/Home

    Abraço

  6. Diego Tremper on 16 Jan 2008 at 23:04 #

    Ola Eduardo,

    nunca trabalhei com o GData e também não tenho conhecimento sobre os formatos de imagem, mas com a sua pergunta acabei dando uma pesquisada sobre o assunto, pelo que percebi no padrão Exif (http://www.exif.org/Exif2-2.PDF), não há nada que fale sobre “tags customizadas”, o que existe, é um conjunto de tags pré-determinadas que podem ser utilizadas, e como provavelmente o GData deve seguir o padrão (Exif), acredito que a solução para o seu problema seria colocar estas informações em outro lugar, arquivo texto, db, etc. Outra solução nada “elegante” seria colocar tudo na descrição da imagem, separado por ponto e vírgula por exemplo, e tratar na hora de inserir e buscar estes dados, o que eu não recomendaria a você :P

    Espero ter ajudado, abraço.

  7. Fábio on 21 Jan 2008 at 13:18 #

    Então Diego, eu coloquei como link para o crowler varrer aquela URL que eu citei no outro post. Ou seja, uma página só e não uma webpage completa e com links.

    Do texto presente nesta página, eu faço a busca e ele não encontrar praticamente nada do que eu procurei. Tem alguma explicação para isso? O Lucene funciona melhor quando é indexada não somente um a página e sim um site inteiro?

    Obrigado.

  8. Diego Tremper on 22 Jan 2008 at 00:55 #

    Ola, Fábio,

    é possivel que você esteja tendo problemas com o mapa de caracteres utilizado pela página web, no exemplo que coloquei eu estava armazenando dados com a codigicação UTF-8, a página que você colocou no seu exemplo ( http://www.csie.ntu.edu.tw/~b2506017/sf/lists.htm ) utiliza o padrão ISO-8859-1.

    no crawler, procure comentar o comando:

    Zend_Search_Lucene_Analysis_Analyzer::setDefault ( new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8 ( ) ) ;

    e substituir:
    $doc->addField ( Zend_Search_Lucene_Field::Text ( ‘url’, $target, ‘UTF-8′ ) ) ;

    por:
    $doc->addField ( Zend_Search_Lucene_Field::Text ( ‘url’, $target, ‘ISO-8859-1′ ) ) ;

    e no controller, substituir:

    Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding ( ‘UTF-8′ ) ;

    por:

    Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding ( ‘ISO-8859-1′ ) ;

    delete os dados do indice (application/data/index) e tente fazer novamente.

    []`s

  9. Fábio on 22 Jan 2008 at 10:19 #

    Obrigado Diego,

    Era isso mesmo, agora funcionou certinho.

    Valewww…

  10. Cairo Noleto on 29 Jan 2008 at 15:43 #

    Olá, vi as series de artigos sobre o PHPUnit e gostaria de mais informação, você sabe me dizer se existe a integração do mesmo com o Eclipse? (Sem o uso do Zend for Eclipse, pois o mesmo não é pago, verdade?) Algum plugin, alguma forma com que eu não precise sair da IDE pra testar minhas classes de testes.

    Aguardo resposta,

    Cairo Noleto
    Desenvolvedor Web

  11. Diego Tremper on 29 Jan 2008 at 22:54 #

    Fala Noleto,

    cara, nunca utilizei nenhum outra ferramenta que integre com o PHPUnit. Mas já li algo sobre o plugin PHPEclipse integrar com o PHPUnit.

    http://sebastian-bergmann.de/archives/586-PHPUnit-Support-in-PHPEclipse.html

    []`s

  12. Cairo Noleto on 31 Jan 2008 at 18:53 #

    Estou com um problema no PHPUnit.

    Nos projetos em que eu trabalho, utilizamos o Lumine pra trabalhar com os dados, e utilizamos uma estrutura de MVC com o Code Igniter. Resolvi começar a brincar com PHPUnit testando as classes do Lumine.

    No primeiro teste, ficou tudo ok, consegui muito bem. Quando adicionei o segundo teste na mesma classe, ele começou a dar erro, e não executa os outros testes da classe. Tentei usar o skeleton pra criar a classe de testes, mas mesmo assim continua com o mesmo erro.

    O erro que ele gera é relacionado ao Lumine, gostaria de saber, como o PHPUnit trata as variaveis que ele cria. Pra testar alguma coisa, após ele fazer a criação e teste “unsetei” os objetos criados após a execução dos testes, mas mesmo assim obtive erro.

    Queria saber se você já esteve neste tipo de cenario, e se podia me ajudar, já que foi a partir de seu blog e você que conheci o PHPUnit ( :D ).

  13. Diego Tremper on 17 Fev 2008 at 19:12 #

    Olá Cairo,

    talvez possa dar um auxílio para vc sim, mas o ideal é que tu tivesse algum exemplo mais prático para me mostrar, só falando assim fica muito vago para mim concluir alguma coisa.

    Abraço

  14. Thiago Lima on 05 Mar 2008 at 18:44 #

    Diego, bom artigo, parabéns

    Tenho algumas perguntas para lhe fazer…

    Consegui até que rodar, mas como faço para criar um índice de todo o conteúdo do meu site?
    Onde devo rodar o arquivo crawler.php? na shell com o comando php crawler.php?
    Como faço para ele seguir links, que não possuem o caminho completo (http://www.blog.com) mas sim (/blog/) ?

    Quais permissões devo dar para a pasta que armazenará o índice?

    bom espero conseguir fazer esse treco rodar aqui

    abraços,

  15. Diego Tremper on 06 Mar 2008 at 00:31 #

    Ola Thiago,

    “Como faço para criar um índice de todo o conteúdo do meu site?”

    - O exemplo que mostrei ele indexa tudo que estiver setado do MATCH_URI (desde que o content-type seja text/html).

    “Onde devo rodar o arquivo crawler.php? na shell com o comando php crawler.php?”

    - Exato, no shell, pode ser pelo browser, mas não é muito conveniente, pode ser que demore a execução do script!

    “Como faço para ele seguir links, que não possuem o caminho completo (http://www.blog.com) mas sim (/blog/) ?”

    - Basta substituir a regra que você quer aplicar pela que já está lá:

    strpos ( $link, MATCH_URI ) !== false

    teste algo do tipo:

    strpos ( $link, “/blog/” ) !== false

    “Quais permissões devo dar para a pasta que armazenará o índice?”

    - Leitura e escrita.

    Espero ter ajudado, qualquer coisa posta ai!

    []’s

  16. Diego Tremper on 06 Mar 2008 at 00:35 #

    Só complementando,

    caso o link tenha apenas o caminho relativo (/blog/) não esqueça de concatenar para ajustar o caminho absoluto, algo do tipo: $link = MATCH_URI . $link;

    []’s

  17. Leandro D. Soares on 27 Abr 2008 at 19:52 #

    Diego,

    Estou tentando entender Zend_Search_Lucene mas está difícil.
    Pelo que percebi ele pega os dados joga em arquivos e realiza a pesquisa nestes arquivos…

    É isso mesmo?

    Se isso é assim mesmo essa é a minha maior dúvida…
    Pegar o que está no banco de dados e jogar para ele, como?

    Minha dúvida é como pegar estes dados do banco de dados…

  18. Diego Tremper on 28 Abr 2008 at 03:08 #

    “Pelo que percebi ele pega os dados joga em arquivos e realiza a pesquisa nestes arquivos…
    É isso mesmo?”
    - Sim.

    “Minha dúvida é como pegar estes dados do banco de dados…”

    - Isso depende do que você tem no banco de dados. Por exemplo: se você possui páginas html armazenadas do banco, basta executar a consulta e criar um novo documento do índice. Da mesma forma que fiz no exemplo que disponibilizei, porém ao invés de extrair os dados de uma determinada url, você pegaria do banco.

    $body = buscaHtmlDoBanco();
    $index = Zend_Search_Lucene::open ( “/caminho/para/os/arquivos/do/indice” ) ;
    $doc = Zend_Search_Lucene_Document_Html::loadHTML ($body, true ) ;
    $index->addDocument ( $doc ) ;

    Mas afinal, por que você quer armazenar dados do banco no sistema de arquivos? O grande lance deste tipo de ferramenta é fazer busca em strings genéricas, não normalizados. No caso do banco de dados, você já tem os dados normalizados (ou pelo menos deveria ter), o que facilita em muito a busca.

  19. Guilherme on 30 Mai 2008 at 14:19 #

    Sobre como indexar todo o conteúdo do site, sendo que os links estão como actions…

    www.fulano.com.br/Main.php?do=talcoisa&submit=aqueleOutro

  20. Ailton on 08 Nov 2008 at 14:05 #

    Olá Diego…

    gostaria de que todos arquivos(de diversas extensões) que fossem enviados p/ meu site fossem indexados p/ que posteriormente fossem pesquisados pelos usuarios….

    ainda não consegui implementar… vc tem algum código de exemplo, site ou artigo ?

    dei uma lida no manual do Zend neste link http://docs.huihoo.com/php/zend/ZendFramework-0.1.5/documentation/end-user/pt-br/zend.search.searching.html
    mas não ficou muito claro… usei os códigos de exemplo mas o máximo que consegui foi criar o indice… mas na hora de pesquisar não consegui…

    não consegui acessar o site que o colega deixou como referencia…
    www.fulano.com.br/Main.php?do=talcoisa&submit=aqueleOutro

    Valeu! desde já obrigado

Trackback URI | Comments RSS

Leave a Reply

« Integrando PHPUnit com banco de dados | Integração contínua com CruiseControl + phpUnderControl »