2009-07-02 18 views
6

Estoy usando Zend_Search_Lucene, el puerto PHP de Java Lucene. Actualmente tengo algún código que construirá una consulta de búsqueda basada en una matriz de cadenas, encontrando resultados para los cuales al menos un campo de índice coincida con cada una de las cadenas enviadas. Simplificada, que se parece a esto:Consultas de comodines de múltiples términos en Lucene?

(Nota: $ palabras es un conjunto construido a partir de la entrada del usuario.)

$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); 

Lo que me como que hacer es sustituir $ palabra con ($ word. '*') - agregando un asterisco al final de cada palabra, convirtiéndolo en un término comodín.

Pero entonces, $ multiq tendría que ser un Zend_Search_Lucene_Search_Query_Wildcard en lugar de un Zend_Search_Lucene_Search_Query_MultiTerm, y no creo que todavía sería capaz de añadir múltiples Index_Terms a cada $ multiq.

¿Hay alguna manera de crear una consulta que sea tanto un comodín como un MultiTerm?

Gracias!

Respuesta

5

No de la manera que usted está esperando para lograrlo, por desgracia:

Lucene soporta búsquedas simples y múltiples carácter comodín dentro términos individuales (pero no dentro de la frase consultas).

e incluso si fuera posible, probablemente no sería una buena idea:

Comodín, rango de búsqueda y difusa consultas pueden coincidir con demasiados términos. Es puede causar una búsqueda increíble rebaja del rendimiento.

Imagino el camino a seguir si insiste en varios términos comodín, serían dos ejecutar dos búsquedas separadas, una para cada término wildcarded, y agrupar los resultados.

Cuestiones relacionadas