Solr FieldCollapsing для более похожих запросов
Я хочу использовать запрос "Больше похожих", чтобы найти похожие документы и свернуть те, которые имеют одинаковое значение для поля "изображение". Я попытался использовать параметры полевого свертывания, однако они, похоже, не работают для "Больше похоже на это".
Ниже приведен фрагмент моего кода. Можете ли вы сказать мне, как свернуть результаты, используя запрос "Больше как это"?
$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));
1 ответ
Общий ответ
Я не мог свернуть результаты, используя параметры Collapsing Field. Тем не менее, я смог достичь желаемого результата с помощью https://wiki.apache.org/solr/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=-signature%3A0&...&fq=%7B!collapse+field%3Dimage+max%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));