Strategie di ricerca negli ORM
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ò ;-)*
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;
}
}