Comment envoyer une requête Solr personnalisée à l'aide de l'API de recherche Solr

8

Je souhaite envoyer une requête solr personnalisée (de préférence dans hook_init) à l'aide de l'API de recherche Solr vers une URL spécifique.

Quelque chose comme:

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

Comment puis-je y parvenir? Y a-t-il un exemple vivant?

Je vous remercie.

kenorb
la source

Réponses:

12

A partir de la version RC4, vous pouvez utiliser makeServletRequest () pour générer des requêtes solr personnalisées. Voir quelques exemples sur GitHub .

Voici quelques exemples de code:

  // 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'];

Le code ci-dessus a été testé dans hook_init avec Drupal 7 et l' API de recherche Solr [rc3] .


Acquia

Si vous utilisez Acquia, vous pouvez utiliser Acquia-Search-Proxy qui vous permet d'envoyer des requêtes personnalisées contre Acquia Search (Apachesolr + Search API Solr). Voir aussi mon fork d' Acquia-Search-Proxy qui inclut quelques améliorations supplémentaires.

Exemples de requêtes personnalisées via 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
la source
6

J'ai vu un exemple dans une présentation à http://nickveenhof.github.io/devdays_solr_wizardry/#/click-recipes-search-api . Je ne comprends pas toutes les lignes de code (je veux dire - pourquoi ajoute-t-il un filtre 'bundle' et le supprime-t-il à nouveau?) Mais j'espère toujours que cela aidera.

$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
la source
Merci pour cela, c'est bien, mais malheureusement c'est pour Apachesolr, pas en utilisant Search API Solr.
kenorb
Désolé, j'ai mal lu votre question. Je n'ai pas d'exemple de code pour l'API de recherche, mais cela ressemble à la documentation sur drupal.org/node/2004270 et la documentation en ligne dans query.inc , en particulier la classe SearchApiQuery, est assez détaillée.
marcvangend
2

SearchApiQuery offre un outil assez complet pour créer des requêtes personnalisées.

Un exemple de code:

  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
la source
2

Afin d'ajouter des facettes à votre requête, utilisez 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
la source