2009-07-02 15 views
6

Sto utilizzando Zend_Search_Lucene, il port PHP di Java Lucene. Al momento ho del codice che costruirà una query di ricerca basata su un array di stringhe, trovando risultati per i quali almeno un campo indice corrisponde a ciascuna delle stringhe inviate. Semplificato, sembra che questo:Quesiti con caratteri jolly a termine multiplo in Lucene?

(Nota: $ parole è un array costruito da input dell'utente.)

$query = new Zend_Search_Lucene_Search_Query_Boolean(); 
foreach ($words as $word) { 
    $term1 = new Zend_Search_Lucene_Index_Term($word, $fieldname1); 
    $term2 = new Zend_Search_Lucene_Index_term($word, $fieldname2); 
    $multiq = new Zend_Search_Lucene_Search_Query_MultiTerm(); 
    $multiq->addTerm($term1); 
    $multiq->addTerm($term2); 
    $query->addSubquery($multiq, true); 
} 
$hits = $index->find($query); 

Quello che vorrei come da fare è sostituire $ parola con ($ word. '*') - aggiungendo un asterisco alla fine di ogni parola, trasformandolo in un termine jolly.

Ma poi, $ multiq avrebbe dovuto essere un Zend_Search_Lucene_Search_Query_Wildcard invece di un Zend_Search_Lucene_Search_Query_MultiTerm, e non credo che sarei ancora in grado di aggiungere più Index_Terms ad ogni $ multiq.

C'è un modo per costruire una query che è sia una Wildcard che una MultiTerm?

Grazie!

risposta

5

Non nel modo che stai sperando di raggiungerlo, purtroppo:

Lucene supporta le ricerche singole e multiple carattere jolly all'interno termini singoli (ma non all'interno frase query).

e anche se fosse possibile, probabilmente non sarebbe una buona idea:

jolly, gamma e sfocata ricerca query possono corrispondere troppi termini. Lo potrebbe causare un incredibile downgrade delle prestazioni di ricerca .

immagino la strada da percorrere se si insiste su più termini jolly, sarebbero due eseguire due ricerche separate, una per ogni termine caratteri jolly, e bundle i risultati insieme.