Pergunta

Estou procurando informações sobre como lidar com pesquisas em diferentes ORMs.

Atualmente estou redesenvolvendo alguns aplicativos antigos em PHP e um dos requisitos é:torne tudo ou quase tudo pesquisável, para que o usuário apenas digite "punkrock live" e o aplicativo encontre videoclipes, faixas de música, resenhas, eventos futuros ou até mesmo comentários de usuários rotulados dessa forma.

Em ambientes onde tudo é pesquisável, o ORM precisa oferecer suporte a esse recurso de duas maneiras:

  • fornecendo alguma API de indexação no lado "O" do ORM
  • fornecendo meios para recuperação de banco de dados em massa no lado "R"

A solução ideal retornaria objetos prontos com base na string pesquisada.Você conhece alguma boa solução ponta a ponta que faça o trabalho, não necessariamente em PHP?Se você lidou com um problema semelhante, seria bom ouvir qual é a sua experiência.Algo mais do que Usar Lucene ou web semântica é o caminho oneliners, embora ;-)*

Foi útil?

Solução

Recentemente integrei o Bússola mecanismo de pesquisa em um aplicativo Java EE 5.É baseado em Lucene Java e suporta diferentes estruturas ORM, bem como outros tipos de modelos como XML ou nenhum modelo real;)

No caso de um modelo de objeto gerenciado por uma estrutura ORM, você pode anotar suas classes com anotações especiais (por exemplo,@Searchable), registre suas classes e deixe o Compass indexá-las na inicialização do aplicativo e ouvir as alterações no modelo automaticamente.

Quando se trata de pesquisar, você tem o poder do Lucene em mãos.O Compass fornece instâncias dos objetos do seu modelo como resultado da pesquisa.

Não é PHP, mas você disse que não precisava ser necessariamente PHP;) Mas não sei se isso ajuda ...

Outras dicas

Em um arquivo schema.xml do Propel 1.3, você pode especificar que deseja que todos os seus modelos estendam uma classe "BaseModel" que VOCÊ cria.

Nesse BaseModel, você redefinirá o método save() para ser algo assim:

public function save(PropelPDO $con = null)
{
    if($this->getIsSearchable())
    {
             // update your search index here. Lucene, Sphinx, or otherwise
    }

    return parent::save($conn);
}

Isso cuida de manter tudo indexado.Quanto à pesquisa, sugiro criar uma classe Search com alguns métodos.

class Search
{
   protected $_searchableTypes = array('music','video','blog');

   public method findAll($search_term)
   {
      $results = array();

      foreach($this->_searchableTypes as $type)
      {
         $results[] = $this->findType($type, $search_term);
      }

      return $results;
   }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top