Я только начал с Apache Solr, и я тоже не большой крэк PHP.
Apache Solr работает, и вставка этого запроса в браузер показывает XML-документ:
http://localhost:8983/solr/my_test/select?q=name:%22A%20Clash%20of%20Kings%22
Однако следующий код выдает исключение UnexpectedValueException:
<?php
require __DIR__.'/vendor/autoload.php';
// check solarium version available
echo 'Solarium library version: ' . Solarium\Client::VERSION . ' - ';
$config = array(
'endpoint' => array(
'localhost' => array(
'host' => '127.0.0.1', 'port' => '8983', 'path' => '/solr/#/my_test/select?q=name:"A Clash of Kings"'
)
)
);
// create a client instance
$client = new Solarium\Client($config);
// // get a select query instance
$query = $client->createQuery($client::QUERY_SELECT);
// // this executes the query and returns the result
$resultset = $client->execute($query);
// display the total number of documents found by solr
echo 'NumFound: '.$resultset->getNumFound(); // THROWS EXCEPTION
// create a ping query
$ping = $client->createPing();
// // execute the ping query
try {
$result = $client->ping($ping);
echo 'Ping query successful';
echo '<br/><pre>';
var_dump($result->getResponse());
echo '</pre>';
} catch (Solarium\Exception $e) {
echo 'Ping query failed';
}
?>
Выход:
Solarium library version: 3.0.0 -
Fatal error: Uncaught exception 'Solarium\Exception\UnexpectedValueException'
with message 'Solr JSON response could not be decoded' in C:\Server\xampp\htdocs\HTML\php\vendor\solarium\solarium\library\Solarium\Core\Query\Result\Result.php:158 Stack trace: #0
C:\Server\xampp\htdocs\HTML\php\vendor\solarium\solarium\library\Solarium\QueryType\Select\ResponseParser\ResponseParser.php(61):
Solarium\Core\Query\Result\Result->getData() #1
C:\Server\xampp\htdocs\HTML\php\vendor\solarium\solarium\library\Solarium\Core\Query\Result\QueryType.php(73):
Solarium\QueryType\Select\ResponseParser\ResponseParser->parse(Object(Solarium\QueryType\Select\Result\Result)) #2
C:\Server\xampp\htdocs\HTML\php\vendor\solarium\solarium\library\Solarium\QueryType\Select\Result\Result.php(144): Solarium\Core\Query\Result\QueryType->parseResponse() #3 C:\Server\xampp\htdocs\HTML\php\lucene.php(25):
Solarium\QueryType\Select\Result\Result->getNumFound() #4 {main} thrown in C:\Server\xampp\htdocs\HTML\php\vendor\solarium\solarium\library\Solarium\Core\Query\Result\Result.php on line 158
Прочитав пост на Github, я изменил:
var_dump($result->getData());
в пинг-запросе
var_dump($result->getResponse());
потому что getData также бросил это исключение.
Что меня немного удивляет, так это то, что говорит
Solr JSON response could not be decoded
но непосредственное использование URL в браузере возвращает XML. Нужно ли где-то настраивать формат сообщения? Нужно ли мне изменить его с XML на JSON или наоборот или что-то? Я использую Solr 5.3.1 на Windows 7.
Когда я закомментирую строку, которая выдает исключение, ответ таков:
Solarium library version: 3.0.0 - Ping query successful
object(Solarium\Core\Client\Response)#8 (4) {
["headers":protected]=>
array(1) {
[0]=>
string(15) "HTTP/1.1 200 OK"}
["body":protected]=>
string(6243) "
Когда вы настраиваете путь к вашему индексу Solr, он не должен включать какой-либо обработчик или параметры запроса. В вашем случае путь Solr должен быть /solr/my_test
, И есть несколько других изменений кода, которые вы должны сделать. Попробуй это…
$config = array(
'endpoint' => array(
'localhost' => array(
'host' => '127.0.0.1',
'port' => '8983',
'path' => '/solr/my_test/'
)
)
);
$client = new Solarium\Client($config);
$query = $client->createSelect();
$helper = $query->getHelper();
$query->setQuery('name:' . $helper->escapePhrase('A Clash of Kings'));
$resultset = $client->select($query);
echo 'NumFound: ' . $resultset->getNumFound();
Это основано на пример экранирования из солярия документы.
Других решений пока нет …