Solr FieldCollapsing for More Like This 查询

Solr FieldCollapsing for More Like This queries

我想使用 "More Like This" 查询来查找相似的文档并折叠字段 'image' 具有相同值的文档。我尝试使用 Field Collapsing parameters,但它们似乎不适用于 "More like this"。

下面是我的代码片段。你能告诉我如何使用 "More Like This" 查询折叠结果吗?

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

一般答案

我无法使用字段折叠参数折叠结果。但是,我能够使用 CollapsingQParserPlugin 获得预期的结果。 以下过滤器查询折叠字段 'image' 上的文档并选择字段 'impressions' 中值最高的文档:{!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+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));