Cách gửi Truy vấn Solr tùy chỉnh bằng API tìm kiếm Solr


8

Tôi muốn gửi truy vấn solr tùy chỉnh (tốt nhất là trong hook_init) bằng cách sử dụng API tìm kiếm Solr đến một URL cụ thể.

Cái gì đó như:

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

Làm thế nào tôi có thể làm để đạt được điều đó? Có ví dụ sống nào không?

Cảm ơn bạn.

Câu trả lời:


12

Từ phiên bản RC4, bạn có thể sử dụng makeServletRequest () để tạo các truy vấn solr tùy chỉnh. Xem một số ví dụ trên GitHub .

Dưới đây là một số ví dụ mã:

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

Mã ở trên đã được thử nghiệm trong hook_init với Drupal 7API tìm kiếm Solr [rc3] .


Mua

Nếu bạn đang sử dụng Acquia, bạn có thể sử dụng Acquia-Search-Proxy cho phép bạn gửi các truy vấn tùy chỉnh đối với Tìm kiếm của Acquia (Apachesolr + Tìm kiếm API Solr). Xem thêm nhánh của tôi về Acquia-Search-Proxy bao gồm một số cải tiến bổ sung.

Ví dụ truy vấn tùy chỉnh thông qua 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

Tôi đã thấy một ví dụ trong một bài thuyết trình tại http://nickveenhof.github.io/devdays_solr_wizardry/#/click-recipes-search-api . Tôi không hiểu từng dòng mã (ý tôi là - tại sao anh ta lại thêm bộ lọc 'bó' và xóa nó một lần nữa?) Nhưng tôi vẫn hy vọng nó có ích.

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

Cảm ơn vì điều đó, thật tốt, nhưng thật không may, nó dành cho Apachesolr, không phải bằng cách sử dụng API tìm kiếm Solr.
kenorb

Xin lỗi, tôi đọc sai câu hỏi của bạn. Tôi không có ví dụ mã cho API tìm kiếm, nhưng có vẻ như tài liệu tại drupal.org/node/2004270 và tài liệu nội tuyến trong query.inc , đặc biệt là lớp SearchApiQuery, khá chi tiết.
marcvangend

2

SearchApiQuery cung cấp một công cụ khá hoàn chỉnh để xây dựng các truy vấn tùy chỉnh.

Một số ví dụ mã:

  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

Để thêm các khía cạnh vào truy vấn của bạn, hãy sử dụng 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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.