2008-08-22 8 views
1

Ich bin auf der Suche nach Informationen zur Handhabung der Suche in verschiedenen ORMs.Suchstrategien in ORMs

Momentan entwickle ich einige alte Anwendungen in PHP neu und eine der Voraussetzungen ist: alles oder fast alles durchsuchbar machen, also tippt der User einfach "punkrock live" und die App findet Videos Clips, Musiktracks, Reviews, bevorstehende Events oder sogar Benutzerkommentare, die auf diese Weise gekennzeichnet sind.

In Umgebung, wo alles durchsuchbare ORM diese Funktion auf zwei Arten unterstützen müssen, ist: auf „O“ von ORM

  • bietet eine Indizierung API
  • Bereitstellung von Mitteln für Bulk-Datenbankabfrage auf „R“ Seite

Ideale Lösung würde fertige Objekte basierend auf gesuchten Zeichenfolge zurückgeben. Kennen Sie gute End-to-End-Lösungen, die diese Aufgabe erfüllen, nicht unbedingt in PHP? Wenn Sie mit ähnlichen Problemen beschäftigt sind, wäre es schön zu hören, was Ihre Erfahrung ist. Etwas mehr als Verwenden Lucene oder Semantic Web ist die Art und Weise oneliners, tho; -) *

Antwort

2

Ich habe vor kurzem die Compass Suchmaschine in eine Java EE 5-Anwendung integriert. Es basiert auf Lucene Java und unterstützt verschiedene ORM-Frameworks sowie andere Arten von Modellen wie XML oder überhaupt kein reales Modell;)

Im Falle eines Objektmodells, das von einem ORM-Framework verwaltet wird, können Sie Ihre Klassen mit speziellen Anmerkungen versehen Annotationen (z. B. @Searchable), registrieren Sie Ihre Klassen und lassen Sie Compass sie beim Start der Anwendung indizieren und hören Sie Änderungen am Modell automatisch an.

Wenn es um die Suche geht, haben Sie die Macht von Lucene zur Hand. Compass gibt Ihnen dann Instanzen Ihrer Modellobjekte als Suchergebnis.

Es ist nicht PHP, aber sie sagte, dass es nicht PHP musste unbedingt sein;) Ich weiß nicht, ob das hilft, aber ...

1

In einem Propel 1.3 schema.xml Datei können Sie angeben, dass Sie möchten, dass alle Ihre Modelle eine "BaseModel" -Klasse erweitern, die Sie erstellen.

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

    return parent::save($conn); 
} 

die Pflege nimmt zu halten alles indiziert: so etwas sein

In diesem Basemodel, Sie gehen, um die save() Methode neu zu definieren. Für die Suche würde ich vorschlagen, eine Suchklasse mit ein paar Methoden zu erstellen.

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; 
    } 
}