Как изменить путь в SolrClient - PullRequest
0 голосов
/ 20 января 2019

Относительно документации необходимо указать путь (т.е. ядро) при инициализации 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');

Но это грязный хак только для меня

1 Ответ

0 голосов
/ 21 января 2019

Создайте фабричный метод и возвращайте разные объекты в зависимости от того, к какому ядру вы обращаетесь.Сохранение состояния объекта, которое меняется в зависимости от того, какое ядро ​​вы запрашиваете, без явной установки через метод запроса, является рецептом для странных ошибок.

Что-то вроде следующего псевдо-кода (у меня нет расширения 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');
...