2010-08-24 7 views
6

Haciendo una búsqueda con Apachesolr, quiero agregar un par de filtros en hook_apachesolr_prepare_query (& $ query). Esto funciona bien, excepto que quiero que los filtros amplíen la búsqueda ('O'), en lugar de limitarla ('AND').Cómo usar filtros múltiples para ampliar la búsqueda en consultas de Apachesolr

Por ejemplo, si tengo 4 nodos de tipo: A y 3 de tipo: B que coinciden con una búsqueda, para filtrar por tipo: A y tipo: B debe devolver 7 nodos (de tipo: A Y nodos de tipo : B), en lugar de 0 los de tipo: A que también son de tipo: B.

vi una sugerencia para hacer esto utilizando el modelo de nodeaccess

foreach ($filters as $filter) { 
    $subquery = apachesolr_drupal_query(); 
    if (!empty($subquery)) { 
    $subquery->add_filter('type', $filter); 
    $query->add_subquery($subquery); 
    } 
} 

pero esto no parece funcionar. (No devuelve ningún resultado).

Luego probé (ya que tengo un número limitado de tipos de nodos) con exclusión de los tipos que no quiero:

$excludes = array('A', 'B', 'C'); 
$excludes = array_diff($excludes, $filters); 
$exclude = implode('&', $excludes); 
$query->add_filter('type', $exclude, TRUE); 

Este método de coserlos juntos no funciona (el '&' se escapó) pero tampoco los agrega como subconsultas, similar a la manera anterior.

¿Alguna sugerencia sobre cómo hacer esto?

+0

También estoy buscando para este – qasimzee

+0

Parece que tienes una respuesta aquí: http://drupal.org/node/892280 derecho? Quizás deberías responderlo tú mismo. – morja

Respuesta

2

Con Drupal7 y el último API apacheSolr, que puedas hacer o filtros al hacer esto:

function my_module_apachesolr_query_alter($query) { 
    // first, create a subQuery filter to store others 
    // and specify there is a "OR" condition 
    $filter = new SolrFilterSubQuery('OR'); 

    // next, add all filters on bundle you want, each as 
    // a new subQuery filter, always with "OR" condition 
    // and add it to the primary filter 
    $a = new SolrFilterSubQuery('OR'); 
    $a->addFilter('bundle', 'A'); 
    $filter->addFilterSubQuery($a); 

    $b = new SolrFilterSubQuery('OR'); 
    $b->addFilter('bundle', 'B'); 
    $filter->addFilterSubQuery($b); 

    $c = new SolrFilterSubQuery('OR'); 
    $c->addFilter('bundle', 'C'); 
    $filter->addFilterSubQuery($c); 

    // finally, add the primary subQuery filter as 
    // subquery of the current query 
    $query->addFilterSubQuery($filter); 

}

Y la consulta de búsqueda sobre el tipo A O tipo B O tipo C (todos los resultados en cada tipo). Puede combinar OR/AND cambiando el parámetro de la instanciación SolrFilterSubQuery.

agradecimiento especial a esta página y su autor: http://fr.ench.info/blog/2012/04/03/Add-Filters-ApacheSOLR.html

0

No he jugado mucho con SOLR, pero estoy familiarizado con Drupal y Zend Lucene (o Drupal Lucene API).

Le sugiero que intente filtrar los resultados según el tipo de contenido (porque cada nodo tiene su tipo de contenido almacenado en el objeto).

La segunda idea es cambiar el operador básico. No estoy seguro de cómo se hace en SOLR pero Zend Lucene

Zend_Search_Lucene_Search_QueryParser :: setDefaultOperator ($ operador) y Zend_Search_Lucene_Search_QueryParser :: getDefaultOperator() métodos, respectivamente.

Los documentos se pueden encontrar en Zend Lucene Docs. O para SOLR Solr Docs.

Espero que tu problema sea el correcto.

espero que ayude :-)

Cuestiones relacionadas