如何更改 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),有没有办法动态更改路径?我找不到 queryrequest 方法的任何选项。

编辑

我找到了一个同样有效的方法:

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