Zend Search Lucene - Buscando un campo específico

Actualmente tengo Zend_Search_Lucene configurado como el motor de búsqueda en el proyecto en el que estoy trabajando.

Está funcionando muy bien en el nivel predeterminado (es decir, buscando en todos los campos), sin embargo, ahora tengo la necesidad de buscar un campo específico.

La razón de esto es porque estoy tratando de codificar en la capacidad de lidiar con faltas de ortografía. Por lo tanto, estoy agregando el soundex de cada una de las palabras en el título del documento.

Por ejemplo:

$productArray['title'] = 'June Monthly Meat Box';  
$doc = new Zend_Search_Lucene_Document();  
$doc->addField(Zend_Search_Lucene_Field::text('product_title', $productArray['title']));  
$soundex = implode(' ',  array_map('soundex', array_map('trim', preg_split('/ /', $productArray['title'], NULL, PREG_SPLIT_NO_EMPTY))));  
$doc->addField(Zend_Search_Lucene_Field::keyword('soundex', $soundex));  
$index->addDocument($doc);

Esto agrega 'J500 M534 M300 B200' como el campo soundex.

Así es como se realiza la búsqueda:

$queryString = trim(urldecode($this->_request->getParam('q')));  
$words = array_map('trim', preg_split('/ /', $queryString, NULL, PREG_SPLIT_NO_EMPTY));    

$query = new Zend_Search_Lucene_Search_Query_Boolean();  
$subquery1 = new Zend_Search_Lucene_Search_Query_MultiTerm();  
foreach($words as $word) 
{  
    $subquery1->addTerm(new Zend_Search_Lucene_Index_Term($word));  
}  

$subquery2 = new Zend_Search_Lucene_Search_Query_MultiTerm();  
foreach($words as $word)
{  
        $subquery2->addTerm(new Zend_Search_Lucene_Index_Term(strtolower(soundex($word)), 'soundex'));  
}  
$query->addSubquery($subquery1);  
$query->addSubquery($subquery2);  

La variable $subquery1 almacena cada una de las palabras de la consulta original (Esto funciona por sí solo)
La variable $subquery2 almacena el soundex de cada palabra. El plan es buscar el campo para el soundex así como los otros campos para cada palabra. Por lo tanto, si alguien escribió mal 'carne' con 'maet', devolvería el resultado ya que el soundex sería el mismo en 'M300'.

Estoy utilizando Luke para ver el conjunto de datos y veo los términos correctos. Cuando uso a Luke para buscar el soundex (es decir. soundex:M300) no devuelve resultados, sin embargo, si busco en todo el campo (es decir. soundex:"J500 M534 M300 B200") devuelve el documento correcto.

¿Qué está fallando para evitar que busque dentro del campo?

preguntado el 03 de mayo de 12 a las 13:05

1 Respuestas

Si entiendo Zend_Search_Lucene_Field::keyword correctamente (lo que usó para "soundex" arriba), está diseñado para almacenar un solo valor a la vez (como una sola fecha o una sola URL).

Creo que para el campo "soundex" desea utilizar un método de almacenamiento tokenizado como Zend_Search_Lucene_Field::text, ya que parece que desea buscar tokens individuales en el campo "soundex", no solo el valor del campo completo.

contestado el 08 de mayo de 12 a las 13:05

Hola Marcos, gracias por la información. Originalmente lo tenía como un campo de texto, pero lo cambié. El motivo del cambio fue que Luke mostró los términos de mayor rango para el campo soundex como una sola letra (como: b, s, r, etc.). Por lo tanto, si busco soundex:m, aparecen todos los resultados donde hay un soundex MXXX. Lo que me parece extraño es que no hay números en los términos. ¿Se ignoran los números para los campos tokenizados? - mark Smith

Lo solucioné, tuve que cambiar el analizador predeterminado porque aprendí que no trata los números como parte de los términos. yo añadí Zend_Search_Lucene_Analysis_Analyzer::setDefault( new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive() ); antes de que se creara el índice y antes de que se buscara en el índice. - mark Smith

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.