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));

person MAcabot    schedule 17.02.2015    source источник


Ответы (1)


Общий ответ

Я не мог свернуть результаты с помощью параметров Field Collapsing. Однако мне удалось добиться желаемого результата с помощью CollapsingQParserPlugin. Следующий запрос фильтра сворачивает документы в поле «изображение» и выбирает документ с наибольшим значением в поле «показы»: {!collapse field=image max=impressions}

Реализация

По какой-то причине мне не удалось объединить этот фильтрующий запрос с другими моими фильтрующими запросами под одним ключом следующим образом:

$filterQueries = [
    "-signature:{$signature}",
    ...
    "{!collapse field=image max=impressions}"
];
$data = [
    ...
    'fq' => implode(' AND ', $filterQueries),
    ...
];

Это вызвало ошибку: запрос не реализует createWeight

Мое исправление состояло в том, чтобы сделать запрос GET (вместо POST, который был сделан в вопросе выше). С запросом GET можно получить ключ для каждого запроса фильтра: http://solr-url/mtl?...&fq=-signature%3A0&...&fq=%7B!collapse+поле%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));
person MAcabot    schedule 25.02.2015