如何在SolrClient中更改路径

时间:2019-01-20 15:41:43

标签: php solr 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');

但这只是对我来说是个肮脏的黑客

1 个答案:

答案 0 :(得分:1)

创建一个工厂方法,并根据要访问的内核返回不同的对象。保持对象状态在您请求的内核之间变化而无需通过查询方法进行显式设置的情况,是解决奇怪错误的秘诀。

类似下面的伪ish代码(我没有可用的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');