Search API Solrを使用して、カスタムsolrクエリを(できればhook_initで)特定のURLに送信したい。
何かのようなもの:
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));
}
どうすればそれを達成できますか?実例はありますか?
ありがとうございました。
バージョンRC4以降、makeServletRequest()を使用してカスタムSolrクエリを生成できます。 GitHubの の例をいくつか参照してください 。
以下にいくつかのコード例を示します。
// 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'];
上記のコードは、 Drupal 7 および Search API Solr [rc3] を使用してhook_initでテストされています。
Acquia
Acquiaを使用している場合は、 Acquia-Search-Proxy を使用して、Acquia Search(Apachesolr + Search API Solr)に対してカスタムクエリを送信できます。 Acquia-Search-Proxy の私のフォークも参照してください。これにはいくつかの追加の改善が含まれています。
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
http://nickveenhof.github.io/devdays_solr_wizardry/#/click-recipes-search-api でのプレゼンテーションの例を見ました。コードのすべての行を理解しているわけではありませんが(つまり、なぜ「バンドル」フィルターを追加して再度削除するのですか?)、それでも役に立てれば幸いです。
$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();
クエリにファセットを追加するには、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);
SearchApiQueryは、カスタムクエリを作成するためのかなり完全なツールを提供します。
いくつかのコード例:
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'];