Cara mengirim Kueri Solr khusus menggunakan Cari API Solr

8

Saya ingin mengirim permintaan khusus solr (lebih disukai di hook_init) menggunakan Cari API Solr ke URL tertentu.

Sesuatu seperti:

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

Bagaimana saya bisa mencapainya? Apakah ada contoh langsung?

Terima kasih.

kenorb
sumber

Jawaban:

12

Dari versi RC4 Anda dapat menggunakan makeServletRequest () untuk menghasilkan kueri solr khusus. Lihat beberapa contoh di GitHub .

Berikut ini beberapa contoh kode:

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

Kode di atas diuji dalam hook_init dengan Drupal 7 dan Search API Solr [rc3] .


Acquia

Jika Anda menggunakan Acquia, Anda dapat menggunakan Acquia-Search-Proxy yang memungkinkan Anda mengirim kueri khusus terhadap Acquia Search (Apachesolr + Search API Solr). Lihat juga cabang saya dari Acquia-Search-Proxy yang mencakup beberapa peningkatan tambahan.

Contoh kueri khusus melalui 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
sumber
6

Saya telah melihat contoh dalam presentasi di http://nickveenhof.github.io/devdays_solr_wizardry/#/click-recipes-search-api . Saya tidak mengerti setiap baris kode (maksud saya - mengapa dia menambahkan filter 'bundle' dan menghapusnya lagi?) Tapi saya masih berharap ini membantu.

$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
sumber
Terima kasih untuk itu, itu bagus, tapi sayangnya itu untuk Apachesolr, bukan dengan menggunakan Pencarian API Solr.
kenorb
Maaf, saya salah membaca pertanyaan Anda. Saya tidak memiliki contoh kode untuk API Pencarian, tetapi sepertinya dokumentasi di drupal.org/node/2004270 dan dokumentasi sebaris di query.inc , terutama kelas SearchApiQuery, cukup detail.
marcvangend
2

SearchApiQuery menawarkan alat yang cukup lengkap untuk membangun kueri khusus.

Beberapa contoh kode:

  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
sumber
2

Untuk menambahkan aspek ke kueri Anda, gunakan 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
sumber