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.

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

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

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

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);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.