Domanda

Sto cercando informazioni sulla gestione della ricerca in diversi ORM.

Attualmente sto riqualificando alcune vecchie applicazioni in PHP e uno dei requisiti è:rendi tutto o quasi tutto ricercabile, quindi l'utente digita semplicemente "punkrock live" e l'app trova clip video, brani musicali, recensioni, eventi imminenti o persino commenti degli utenti etichettati in questo modo.

In un ambiente in cui tutto è ricercabile, ORM deve supportare questa funzionalità in due modi:

  • fornendo alcune API di indicizzazione sul lato "O" di ORM
  • fornire mezzi per il recupero di massa del database sul lato "R".

La soluzione ideale restituirebbe oggetti già pronti in base alla stringa cercata.Conosci qualche buona soluzione end-to-end che svolga il lavoro, non necessariamente in PHP?Se hai affrontato un problema simile, sarebbe bello ascoltare qual è la tua esperienza.Qualcosa di più di Usa Lucene O il web semantico è la strada battute, però ;-)*

È stato utile?

Soluzione

Recentemente ho integrato il Bussola motore di ricerca in un'applicazione Java EE 5.È basato su Lucene Giava e supporta diversi framework ORM così come altri tipi di modelli come XML o nessun modello reale ;)

Nel caso di un modello a oggetti gestito da un framework ORM puoi annotare le tue classi con annotazioni speciali (es.@Searchable), registra le tue classi e lascia che Compass le indicizzi all'avvio dell'applicazione e ascolti automaticamente le modifiche al modello.

Quando si tratta di ricerca, hai il potere di Lucene a portata di mano.Compass ti fornisce quindi istanze degli oggetti del tuo modello come risultato della ricerca.

Non è PHP, ma hai detto che non doveva essere necessariamente PHP ;) Non so se questo aiuta, però...

Altri suggerimenti

In un file schema.xml di Propel 1.3, puoi specificare che desideri che tutti i tuoi modelli estendano una classe "BaseModel" creata da TU.

In quel BaseModel, ridefinirai il metodo save() in modo che sia qualcosa del genere:

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

    return parent::save($conn);
}

Questo si occupa di mantenere tutto indicizzato.Per quanto riguarda la ricerca, suggerirei di creare una classe Search con alcuni metodi.

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;
   }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top