如何更改 SolrClient 中的路径
How to change path in SolrClient
关于 documentation 必须在 SolrClient
初始化时设置路径(即核心):
$client = new SolrClient([
'hostname' => 'localhost',
'port' => 8983,
'path' => '/solr/coreXYZ',
]);
由于我需要访问多个内核(例如/solr/core_1
、/solr/core_2
),有没有办法动态更改路径?我找不到 query
或 request
方法的任何选项。
编辑
我找到了一个同样有效的方法:
$client->setServlet(SolrClient::SEARCH_SERVLET_TYPE, '../' . $core . '/select');
$client->setServlet(SolrClient::UPDATE_SERVLET_TYPE, '../' . $core . '/update');
但这只是对我来说的肮脏黑客
创建工厂方法和 return 不同的对象,具体取决于您访问的核心。保持对象状态在您请求的核心之间发生变化,而不是通过查询方法明确设置是奇怪错误的一个秘诀。
类似于下面的伪代码(我没有可用的 Solr 扩展,所以我无法测试它):
class SolrClientFactory {
protected $cache = [];
protected $commonOptions = [];
public function __construct($common) {
$this->commonOptions = $common;
}
public function getClient($core) {
if (isset($this->cache[$core])) {
return $this->cache[$core];
}
$opts = $this->commonOptions;
// assumes $path is given as '/solr/'
$opts['path'] .= $core;
$this->cache[$core] = new SolrClient($opts);
return $this->cache[$core];
}
}
$factory = new SolrClientFactory([
'hostname' => 'localhost',
'port' => 8983,
'path' => '/solr/',
]);
$client = $factory->getClient('coreXYZ');
关于 documentation 必须在 SolrClient
初始化时设置路径(即核心):
$client = new SolrClient([
'hostname' => 'localhost',
'port' => 8983,
'path' => '/solr/coreXYZ',
]);
由于我需要访问多个内核(例如/solr/core_1
、/solr/core_2
),有没有办法动态更改路径?我找不到 query
或 request
方法的任何选项。
编辑
我找到了一个同样有效的方法:
$client->setServlet(SolrClient::SEARCH_SERVLET_TYPE, '../' . $core . '/select');
$client->setServlet(SolrClient::UPDATE_SERVLET_TYPE, '../' . $core . '/update');
但这只是对我来说的肮脏黑客
创建工厂方法和 return 不同的对象,具体取决于您访问的核心。保持对象状态在您请求的核心之间发生变化,而不是通过查询方法明确设置是奇怪错误的一个秘诀。
类似于下面的伪代码(我没有可用的 Solr 扩展,所以我无法测试它):
class SolrClientFactory {
protected $cache = [];
protected $commonOptions = [];
public function __construct($common) {
$this->commonOptions = $common;
}
public function getClient($core) {
if (isset($this->cache[$core])) {
return $this->cache[$core];
}
$opts = $this->commonOptions;
// assumes $path is given as '/solr/'
$opts['path'] .= $core;
$this->cache[$core] = new SolrClient($opts);
return $this->cache[$core];
}
}
$factory = new SolrClientFactory([
'hostname' => 'localhost',
'port' => 8983,
'path' => '/solr/',
]);
$client = $factory->getClient('coreXYZ');