Solr Streaming Expression с использованием PHP Curl - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь реализовать следующее потоковое выражение с помощью PHP curl.

curl --data-urlencode 'expr=search(enron_emails,
                   q="from:1800flowers*",
                   fl="from, to",
                   sort="from asc",
                   qt="/export")' http://localhost:8983/solr/enron_emails/stream

Вышеупомянутый запрос curl из командной строки работает нормально.Однако, запуск того же самого с помощью php curl не работает.Я использовал следующий код PHP.

function streamSolrData() {
    $url = 'http://localhost:8983/solr/enron_emails/stream';

    $data['expr']['search'] = "enron_emails";
    $data['expr']['search']['q'] = 'from:1800flowers*';
    $data['expr']['search']['fl'] = "from, to";
    $data['expr']['search']['sort'] = "from asc";
    $data['expr']['search']['qt'] = "/export";

    $data = json_encode($data);
    $ch = curl_init();

    if ($ch) {
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_USERAGENT, "MozillaXYZ/1.0");

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
            'Content-Type: application/json',                                                                                
            'Content-Length: ' . strlen($data))                                                                       
        );                                                                                                                   


        $response = curl_exec($ch);
    }
}

Выше запрос просто возвращает {"result-set":{"docs":[{"EXCEPTION":null,"EOF":true}]}} без каких-либо результатов.

Есть идеи, что мне здесь не хватает?

Iнашел ответ на это.В идеале solr ожидает передачи одного параметра с именем expr.Ниже приводится решение.

РЕШЕНИЕ

function streamSolrData() {
        $url = 'http://localhost:8983/solr/enron_emails/stream';

        $data['expr'] = 'search(enron_emails,
                                   q="from:1800flowers*",
                                   fl="from, to",
                                   sort="from asc",
                                   qt="/export")'

        $ch = curl_init();

        if ($ch) {
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_USERAGENT, "MozillaXYZ/1.0");

            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);                                                                                                     
            $response = curl_exec($ch);
        }
    }

1 Ответ

0 голосов
/ 14 сентября 2018

Вы отправляете JSON, но структура, заданная для потокового выражения, не является JSON, поэтому кодирование содержимого в виде JSON приведет к неверному запросу.

Если вы посмотрите на запрос:

expr=search(enron_emails,
               q="from:1800flowers*",
               fl="from, to",
               sort="from asc",
               qt="/export")

.. это не допустимый объект JSON или структура JSON в любом случае.

Вместо этого используйте CURLOPT_POSTFIELDS, который включает в себя содержимое, необработанное в теле запроса POST:

curl_setopt($ch, CURLOPT_POSTFIELDS,
           urlencode('expr=search(enron_emails,
               q="from:1800flowers*",
               fl="from, to",
               sort="from asc",
               qt="/export")'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...