Я хочу использовать запрос «Больше похожих», чтобы найти похожие документы и свернуть те, которые имеют одинаковое значение для поля «изображение». Я пытался использовать Параметры свертывания поля однако они, кажется, не работают для «Больше как это».
Ниже приведен фрагмент моего кода. Можете ли вы сказать мне, как свернуть результаты с помощью запроса «Больше как это»?
$url = "http://{$host}:{$port}/solr/{$core}/mlt";
$data = [
'stream.body' => $content,
'fl' => 'image,content,title,signature',
'start' => 0,
'order' => "score desc",
'wt' => 'json',
'mlt.fl' => 'content,title',
// these lines do nothing ---v
'group' => 'true',
'group.field' => 'image',
'group.sort' => 'impressions desc',
'group.main' => 'true'
];
$curlHandle = curl_init($url);
$options = array (
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => $data
);
curl_setopt_array($curlHandle , $options);
$result = json_decode(curl_exec($curlHandle));
Я не мог свернуть результаты, используя параметры Collapsing Field. Тем не менее, я смог достичь желаемого результата с помощью CollapsingQParserPlugin.
Следующий запрос фильтра сворачивает документы в поле «изображение» и выбирает тот, который имеет наибольшее значение для поля «показы»: {!collapse field=image max=impressions}
По какой-то причине мне не удалось объединить этот запрос фильтра с моими другими запросами фильтра под одним ключом следующим образом:
$filterQueries = [
"-signature:{$signature}",
...
"{!collapse field=image max=impressions}"];
$data = [
...
'fq' => implode(' AND ', $filterQueries),
...
];
Это привело к ошибке: Query не реализует createWeight
Мое исправление состояло в том, чтобы сделать запрос GET (вместо POST, что было сделано в вопросе выше). С помощью запроса GET можно получить ключ для каждого запроса фильтра: HTTP: // Solr-URL / MTL …&FQ = -Подписание% 3A0&…&FQ =% 7B! коллапс + поле% 3Dimage + макс% 3Dimpressions% 7D
Ниже приведено решение php для фрагмента в вопросе:
$url = "http://{$host}:{$port}/solr/{$core}/mlt?"; // Note the added question mark
$data = [
'stream.body' => $content,
'fl' => 'image,content,title,signature',
'fq' => $filterQueries,
'start' => 0,
'order' => "score desc",
'wt' => 'json',
'mlt.fl' => 'content,title'
];
$params = [];
foreach ($data as $key=>$value) {
if (is_array($value)) {
foreach ($value as $subvalue) {
$subvalue = urlencode($subvalue);
$params[] = "{$key}={$subvalue}";
}
} else {
$value = urlencode($value);
$params[] = "{$key}={$value}";
}
}
$url .= implode('&', $params);
$curlHandle = curl_init($url);
$options = array ();
curl_setopt_array($curlHandle , $options);
$result = json_decode(curl_exec($curlHandle));
Других решений пока нет …