2009-08-19 5 views
0

Ich versuche, eine Searchmachine in meine Website zu implementieren. Ich benutze dafür Zend_Search_Lucene.Zend_Search_Luncene Handle Querys

Der Index wird wie folgt erstellt:

public function create($config, $create = true) 
{ 
    $this->_config = $config; 

    // create a new index 
    if ($create) { 
     Zend_Search_Lucene_Analysis_Analyzer::setDefault(
      new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive() 
     ); 

     $this->_index = Zend_Search_Lucene::create(APPLICATION_PATH . $this->_config->index->path); 
    } else { 
     $this->_index = Zend_Search_Lucene::open(APPLICATION_PATH . $this->_config->index->path); 
    } 
} 

{

public function addToIndex($data) 
    $i = 0; 

    foreach ($data as $val) { 
     $scriptObj = new Sl_Model_Script(); 
     $scriptObj->title = $val['title']; 
     $scriptObj->description = $val['description']; 
     $scriptObj->link = $val['link']; 
     $scriptObj->tutorials = $val['tutorials']; 
     $scriptObj->screenshot = $val['screenshot']; 
     $scriptObj->download = $val['download']; 
     $scriptObj->tags = $val['tags']; 
     $scriptObj->version = $val['version']; 
     $this->_dao->add($scriptObj); 
     $i++; 
    } 

    return $i; 
} 


/** 
    * Add to Index 
    * 
    * @param Sl_Interface_Model $scriptObj 
    */ 
    public function add(Sl_Interface_Model $scriptObj) 
    { 

     // UTF-8 for INDEX 

     $doc = new Zend_Search_Lucene_Document(); 
     $doc->addField(Zend_Search_Lucene_Field::text('title', $scriptObj->title, 'utf-8')); 
     $doc->addField(Zend_Search_Lucene_Field::text('tags', $scriptObj->tags, 'utf-8')); 
     $doc->addField(Zend_Search_Lucene_Field::text('version', $scriptObj->version, 'utf-8')); 
     $doc->addField(Zend_Search_Lucene_Field::text('download', $scriptObj->download, 'utf-8')); 
     $doc->addField(Zend_Search_Lucene_Field::text('link', $scriptObj->link)); 
     $doc->addField(Zend_Search_Lucene_Field::text('description', $scriptObj->description, 'utf-8')); 
     $doc->addField(Zend_Search_Lucene_Field::text('tutorials', $scriptObj->tutorials, 'utf-8')); 
     $doc->addField(Zend_Search_Lucene_Field::text('screenshot', $scriptObj->screenshot)); 
     $this->_index->addDocument($doc); 

    } 

Aber wenn ich versuche, den Index abfragen mit:

$ index-> ​​find ('Wordpress 2.8. 1 '.' * ');

im den folgenden Fehler erhalten: "Nicht-Wildcard-Zeichen am Anfang des Musters erforderlich sind"

irgendwelche ideen wie für eine string wie mine zu fragen? eine Abfrage für "wordpress" funktioniert wie freigestellt.

Antwort

1

Lucene kann nicht mit führenden Wildcards umgehen, nur mit nachfolgenden. Das heißt, dass es keine Unterstützung für Abfragen wie ‚sagen Sie mir, jeder, dessen Name endet mit‚att‘‘, die so etwas wie

first_name wäre: * att

Es unterstützt nur Hinter Platzhalter. Sagen Sie mir, alle, deren Namen Ende, die mit 'ma' starten

first_name: ma *

Sehen Sie diese Lucene FAQ-Eintrag:

http://wiki.apache.org/lucene-java/LuceneFAQ#head-4d62118417eaef0dcb87f4370583f809848ea695

gibt es eine Abhilfe für Lucene 2.1, aber die Entwickler sagen, es kann "teuer" sein.

+0

danke, so ist es nur möglich, für ein "Wort" abzufragen? – opHASnoNAME

+0

Nein, Sie könnten nach mehreren Wörtern mit nachfolgenden Präfixen suchen, sagen wir, Sie wollten alle Dokumente finden, die mit "kine" oder "dict" beginnen: name: kine * ODER name: dict * Grundsätzlich nur ODER die Klauseln zusammen. Beantwortet das Ihre Frage? –