Cómo enviar una consulta Solr personalizada con Search API Solr

8

Me gustaría enviar una consulta solr personalizada (preferiblemente en hook_init) usando Search API Solr a una URL específica.

Algo como:

function hook_init() {
  $url = "admin/luke?show=schema";
  $solr = new SearchApiSolrService(); // must have an instance of SearchApiServer
  // $httpTransport->performHeadRequest($url);
  // $response = _sendRawGet($url);
  drupal_set_message(print_r($response, TRUE));
}

¿Cómo puedo lograr eso? ¿Hay algún ejemplo en vivo?

Gracias.

kenorb
fuente

Respuestas:

12

Desde la versión RC4, puede usar makeServletRequest () para generar consultas de solución personalizadas. Vea algunos ejemplos en GitHub .

Aquí hay algunos ejemplos de código:

  // Ping example
  // class_exists('Apache_Solr_Service') ?: spl_autoload_register('_search_api_solr_autoload'); // make sure that SolrPhpClient class is loaded (use only for <=rc3)
  $server = search_api_server_load('my_solr_server'); // CHANGE THIS
  $solr = new SearchApiSolrService($server);
  $result = $solr->ping();
  drupal_set_message(print_r($result, TRUE));

  // Simple search query (not fully tested)
  // class_exists('Apache_Solr_Service') ?: spl_autoload_register('_search_api_solr_autoload'); // make sure that SolrPhpClient class is loaded (use only for <=rc3)
  $server = search_api_server_load('my_solr_server'); // CHANGE THIS
  $index = search_api_index_load('my_index'); // CHANGE THIS
  $query = new SearchApiQuery($index);
  $query->keys('foo'); 
  $query->fields(array('title')); 
  $solr = new SearchApiSolrService($server);
  $result = $solr->search($query);
  drupal_set_message(print_r($result, TRUE));

  // Custom path example for rc4 and above (not fully tested)
  $server = search_api_server_load('my_solr_server');
  $uri = SearchApiSolrConnection::LUKE_SERVLET . "?show=schema"; // or any other custom URL
  $connection = $server->getSolrConnection(); // or: new SearchApiSolrService($server)
  $response = $connection->makeServletRequest($uri);
  drupal_set_message(print_r($response, TRUE));

  // Example for assembling the right URL
  $server = search_api_server_load('my_solr_server');
  $url = 'http://' . $server->options['host'] . ':' . $server->options['port'] . $server->options['path'];

El código anterior se probó en hook_init con Drupal 7 y Search API Solr [rc3] .


Acquia

Si está utilizando Acquia, puede usar Acquia-Search-Proxy que le permite enviar consultas personalizadas contra Acquia Search (Apachesolr + Search API Solr). Vea también mi bifurcación de Acquia-Search-Proxy que incluye algunas mejoras adicionales.

Ejemplo de consultas personalizadas a través de CLI:

PATH_INFO="/admin/ping" php search-proxy.php
PATH_INFO="/admin/luke" QUERY_STRING="show=schema" php search-proxy.php
PATH_INFO="/select" QUERY_STRING="q=foo" php search-proxy.php
PATH_INFO="/admin/file" QUERY_STRING="contentType=text/xml;charset=utf-8&file=schema.xml" php search-proxy.php
kenorb
fuente
6

He visto un ejemplo en una presentación en http://nickveenhof.github.io/devdays_solr_wizardry/#/click-recipes-search-api . No entiendo todas las líneas de código (quiero decir, ¿por qué agrega un filtro de 'paquete' y lo elimina de nuevo?) Pero todavía espero que ayude.

$solr = apachesolr_get_solr();
$query = apachesolr_drupal_query("custom", array('q' => 'mykeys'), 'sort_label asc', 'search/path');
$query->setSolrsort('sort_name', 'desc');
$query->addFilter('bundle', (article OR page));
$query->removeFilter('bundle');
$query->addParam('fq', "bundle:(article OR page)");
$query->addParam('fq', "field_date:[1970-12-31T23:59:59Z TO NOW]");
$resp = $query->search();
marcvangend
fuente
Gracias por eso, es bueno, pero desafortunadamente es para Apachesolr, no usando Search API Solr.
kenorb
Lo siento, leí mal tu pregunta. No tengo un ejemplo de código para Search API, pero parece que la documentación en drupal.org/node/2004270 y la documentación en línea en query.inc , especialmente la clase SearchApiQuery, es bastante detallada.
marcvangend
2

SearchApiQuery ofrece una herramienta bastante completa para crear consultas personalizadas.

Algún ejemplo de código:

  global $language;
  $term = 'TERM_TO_SEARCH_IN_THE_TITLE';

  // Select an index.      
  $index = search_api_index_load("default_multilingual_node_index");
  $query = new SearchApiQuery($index);

  // Build a filter.
  $filter = $query->createFilter('OR');
  $filter->condition('type', 'article', '=');
  $filter->condition('type', 'blog_post', '=');
  $query->filter($filter);

  // Conditions.
  $query->condition('title_field', $term, '=');
  $query->condition('language', $language->language, '=');
  $query->sort('timestamp_field');

  // Fetch results.
  $results = $query->execute()['results'];
David Piry
fuente
2

Para agregar facetas a su consulta, use setOption

$query = new SearchApiQuery($index);
$query->keys(''); 
$query->range(0,0); 
$query->fields(array());
$query->setOption('search_api_facets',array(array('field'=>'field_country'))); 
$solr = new SearchApiSolrService($server);
$result = $solr->search($query);
Marek Tichy
fuente