2009-03-23 8 views
1

Ich bin auf der Anwendung arbeiten bei http://demos.zatechcorp.com/codeigniter/Zend Framework Lucene Boolean/„Google“ -ähnlichen Suche

In der aktuellen Fassung auf meinem Rechner läuft, ich die ZendFramework innerhalb Codeigniter geladen und erzeugt einen Index, wie diese :

// ... Some code that loads all the markets 
    foreach ($markets as $market) 
    { 
     $doc = new Zend_Search_Lucene_Document(); 
     // Id for retrieval 
     $doc->addField(Zend_Search_Lucene_Field::UnIndexed('id', $market->id)); 
     // Store document URL to identify it in search result. 
     $doc->addField(Zend_Search_Lucene_Field::Text('url', $market->permalink)); 
     // Index document content 
     $doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $market->description)); 
     // Title 
     $doc->addField(Zend_Search_Lucene_Field::Text('title', $market->title)); 
     // Phone 
     $doc->addField(Zend_Search_Lucene_Field::Keyword('phone', $market->phone)); 
     // Fax 
     $doc->addField(Zend_Search_Lucene_Field::Keyword('fax', $market->fax)); 
     // Street 
     $doc->addField(Zend_Search_Lucene_Field::Keyword('street', $market->street)); 
     // City 
     $doc->addField(Zend_Search_Lucene_Field::Keyword('city', $market->city)); 
     // State 
     $doc->addField(Zend_Search_Lucene_Field::Keyword('state', $market->state)); 
     // Zip 
     $doc->addField(Zend_Search_Lucene_Field::Keyword('zip', $market->zip)); 
     // Type 
     $doc->addField(Zend_Search_Lucene_Field::UnIndexed('type', 'market')); 

     // Store Document 
     $index->addDocument($doc); 
    } 

In meiner Suche ich dies tun:

$hits = $index->find($q); 

Dies funktioniert mit einfachen Worten, aber wenn ich eine Suche wie "Sheba Foods" tun wollen (Zitate enthalten d), es gibt ein Ergebnis zurück, aber das falsche, das nicht einmal das Wort "Sheba" hat.

Ich habe mich wegen der offensichtlichen Probleme von der MySQL-Volltextsuche entfernt und kann damit keine Fortschritte machen.

Ich habe die Zend_Search_Lucene_Search_QueryParser :: parse() -Methode betrachtet. Liegt die Antwort in dieser Methode?

Antwort

3

ich es herausgefunden. Mit Lucene können Sie ein Feld mit dem Namen 'id' hinzufügen, aber das Abrufen der ID aus einem Treffer gibt Ihnen etwas anderes - ich nehme an, das ist die ID des Suchbegriffs innerhalb der gesamten Suchergebnisse.

Was hatte ich in diesem Fall zu tun war, einen anderen Feldnamen wie folgt verwenden:

// Id for retrieval 
    $doc->addField(Zend_Search_Lucene_Field::UnIndexed('item_id', $market->id)); 
+1

"ID" ist die ID des Dokuments im Index gespeichert. du * kannst * id verwenden, du musst es nur über getDocument() -> id referenzieren. – typeoneerror

-2

Ich habe MySQL-Volltextsuche in der Vergangenheit verwendet, aber es ist wirklich CPU-intensiv.

Sie immer auf einer SELECT * FROM Tabelle verlassen konnte WHERE column = '% query%'

:)

+0

die wahrscheinlich SELECT * FROM Tabelle WHERE Spalte LIKE '% query%' sein sollte. Dennoch bietet diese spezielle Methode nicht viele Suchmöglichkeiten (boolesche Operationen, Ausschlüsse usw.). –