Основываясь на примере здесь (и других местах), я пытаюсь добавить запись в простой индекс Solr (единственными полями являются src и dest, оба поля строки с одним значением, а solrconfig настроен на автоматическое создание значения id) через PHP и cURL с использованием следующего кода:
$data = array(
"add" => array(
"doc" => array(
"src" => $src,
"dest" => $dest
),
"commitWithin" => 1000,
),
);
$data_string = json_encode(array($data));
$add_url = 'https://my-solr-url.com/solr/my_index/update?commit=true&wt=json';
$add_ch = curl_init($add_url);
curl_setopt($add_ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($add_ch, CURLOPT_POST, 1);
curl_setopt($add_ch, CURLOPT_HTTPHEADER, array('Content-type: application/json'));
curl_setopt($add_ch, CURLOPT_POSTFIELDS, $data_string);
$add_response = json_decode(curl_exec($add_ch));
curl_close($add_ch);
Однако когда я запускаю его, я получаю следующую ошибку:
Error parsing JSON field value. Unexpected OBJECT_START at [16], field=add
На основе Документы Solr я попробовал следующий вариант:
$data = array(
'src' => $src,
'dest' => $dest
);
$data_string = json_encode(array($data));
$add_url = 'https://my-solr-url.com/solr/my_index/update/json/docs?commit=true&wt=json';
$add_ch = curl_init($add_url);
curl_setopt($add_ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($add_ch, CURLOPT_POST, 1);
curl_setopt($add_ch, CURLOPT_HTTPHEADER, array('Content-type: application/json'));
curl_setopt($add_ch, CURLOPT_POSTFIELDS, $data_string);
$add_response = json_decode(curl_exec($add_ch));
curl_close($add_ch);
Но теперь я получаю сообщение об ошибке Unknown field src. Насколько я могу судить, я слежу за документами, но ничего не работает. Что мне нужно изменить?
Потому что это массив PHP (это код PHP), а данные в URL-адресе должны быть в формате json.
Но, как спросил @YvesLeBorg, почему именно $data_string = json_encode(array($data)); ...? Вобще $data_string = json_encode($data);
Ой. спасибо, @IncredibleHat, я понимаю, о чем вы говорите. Это помогло. Добавлю ответ.






Оказывается, проблема заключалась в том, что я создавал двойной массив:
$data = array(
"add" => array(
"doc" => array(
"src" => $src,
"dest" => $dest
),
"commitWithin" => 1000,
),
);
$data_string = json_encode(array($data));
Как только я изменил последнюю строку на
$data_string = json_encode($data);
все работало нормально.
почему вы кодируете
aray($data), а не просто$data?