繁体   English   中英

为什么在Solr中这种工作不起作用?

[英]Why wont this sort in Solr work?

我需要对名称为“ mod_date”的日期字段类型进行排序。

在浏览器的地址栏中,它的工作方式如下:

   http://localhost:8983/solr/select/?&q=bmw&sort=mod_date+desc

但是我正在使用phpSolr客户端,该客户端将URL发送到Solr,并且发送的url是这样的:

 fq=+category%3A%22Bilar%22+%2B+car_action%3AS%C3%A4ljes&version=1.2&wt=json&json.nl=map&q=%2A%3A%2A&start=0&rows=5&sort=mod_date+desc

 // This wont work and is echoed after this in php:

 $queryString = http_build_query($params, null, $this->_queryStringDelimiter);
 $queryString = preg_replace('/%5B(?:[0-9]|[1-9][0-9]+)%5D=/', '=', $queryString);

这行不通,我不知道为什么!

其他一切正常,返回所有正确的字段。 但是排序不起作用。

有任何想法吗?

谢谢

顺便说一句:字段“ mod_date”包含类似以下内容:

    2010-03-04T19:37:22.5Z

编辑:

首先,我使用PHP将其发送到SolrPhpClient,这是另一个名为service.php的php文件:

    require_once('../SolrPhpClient/Apache/Solr/Service.php');
    $solr = new Apache_Solr_Service('localhost', 8983, '/solr/');
    $results = $solr->search($querystring, $p, $limit, $solr_params);

$ solr_params是一个包含solr参数(q,fq等)的数组。

现在,在service.php中:

            $params['version'] = self::SOLR_VERSION;

    // common parameters in this interface
    $params['wt'] = self::SOLR_WRITER;
    $params['json.nl'] = $this->_namedListTreatment;

    $params['q'] = $query;
    $params['sort'] = 'mod_date desc'; // HERE IS THE SORT I HAVE PROBLEM WITH

    $params['start'] = $offset;
    $params['rows'] = $limit;
            $queryString = http_build_query($params, null, $this->_queryStringDelimiter);
            $queryString = preg_replace('/%5B(?:[0-9]|[1-9][0-9]+)%5D=/', '=', $queryString);

     if ($method == self::METHOD_GET)
    {
 return $this->_sendRawGet($this->_searchUrl . $this->_queryDelimiter . $queryString);
    }
else if ($method == self::METHOD_POST)
    {
    return $this->_sendRawPost($this->_searchUrl, $queryString, FALSE, 'application/x-www-form-urlencoded');
    }

$results包含Solr的结果...所以这是我需要开始工作的方式(通过php)。

下面的代码(也在此问题的顶部)起作用,但这是因为我手动将其粘贴到地址栏中,而不是通过PHPclient。 但这仅用于调试,我需要通过PHPclient使其起作用:

  http://localhost:8983/solr/select/?&q=bmw&sort=mod_date+des // Not via phpclient, but works

更新(2010-03-08):我已经尝试过Donovans代码(URL),并且它们工作正常。 现在,我注意到它是导致“ SORT”不起作用的参数之一。 此参数是“ wt”参数。 如果我们从此Q的顶部获取网址,则(fq=+category%3A%22Bilar%22+%2B+car_action%3AS%C3%A4ljes&version=1.2&wt=json&json.nl=map&q=%2A%3A%2A&start=0&rows=5&sort=mod_date+desc) ,只需删除“ wt”参数,即可进行排序。 但是结果看起来有所不同,因此使我的php代码无法识别我相信的结果。 我想多诺万会知道这一点。 我猜测为了使PHPClient能够正常工作,结果必须位于特定的结构中,一旦删除wt参数,该结构就会混乱。

多诺万,请帮帮我...

这是我使用您的SolrPhpClient的背景知识:我有一个使用MySql的分类网站。 但是对于搜索,我正在使用Solr搜索一些索引字段。 然后,Solr返回一个ID:numbers数组(用于搜索条件的所有匹配项)。 然后,我使用这些ID:numbers在MySql数据库中查找所有内容并获取所有其他信息(示例不是可搜索的信息)。

如此简化:搜索-> Solr返回ID数组中的所有匹配项:nrs-> Id:Solr中的数字与MySql db中的ID数相同,因此我可以对每个具有ID的记录进行一次简单的匹配匹配Solr结果数组中的ID。

我不使用Faceting,没有提升功能,没有相关性或其他花哨的东西。 我仅按最新的分类看跌期权进行分类,并向用户提供选择,使其也可以按最便宜的价格进行分类。 而已。

然后,我根据用户选择的类别使用“ fq”参数对Solr中的不同字段进行查询(在这种情况下,示例为“汽车”,在我的语言中为“ Bilar”)。

我真的在这里遇到了这个问题...感谢所有帮助

正如堆栈溢出注释中指出的那样,您的浏览器查询与基于php客户端的查询不同-要从方程式中删除该查询,应对此更正进行测试。 为了获得与基于浏览器的查询相同的结果,您的PHP代码应该看起来像这样:

$solr = new Apache_Solr_Client(...);

$searchOptions = array(
  'sort' => 'mod_date desc'
);

$results = $solr->search("bmw", 0, 10, $searchOptions);

相反,我想它看起来更像是:

$searchOptions = array(
    'fq' => 'category:"Bilar" + car_action:Sälje',
    'sort' => 'mod_date desc'
)

$solr->search("\*:*", 0, 10, $searchOptions);

我希望您看到的是php客户端结果将与基于浏览器的结果相同,并且我想如果以相反的方式进行操作,也会发生相同的情况-从php客户端获取当前参数并将其正确应用于基于浏览器的查询。

现在解决您的问题,您看不到文档排序正确。

我会尝试此查询,这相当于基于php客户端的代码:

http://localhost:8983/solr/select/?&q=%2A%3A%2A&fq=+category%3A%22Bilar%22+%2B+car_action%3AS%C3%A4ljes&sort=mod_date+desc

与该查询相比,该查询将过滤器查询移至主查询中:

http://localhost:8983/solr/select/?&q=+category%3A%22Bilar%22+%2B+car_action%3AS%C3%A4ljes&sort=mod_date+desc

看看是否有区别。 如果存在,那么使用solr来对缓存的过滤查询的结果进行使用和排序可能是一个错误—客户端不是问题,而是solr服务本身。

希望这能使您更接近分析者。

将会话的值用于保存排序参数。

可能与json.nl=map参数有关。 当使用wt=jsonjson.nl=map将响应设置为JSON时,使用facet.sortf.<field_name>.facet.sort=count|index选项无法按预期对构面进行排序。

例如, facet.sort=count使用facet.sort=countwt=json ,我得到:

"dc_coverage": [
    "United States",
    5,
    "19th century",
    1,
    "20th century",
    1,
    "Detroit (Mich.)",
    1,
    "Pennsylvania",
    1,
    "United States--Michigan--Detroit",
    1,
    "United States--Washington, D.C.",
    1
]

但是,使用facet.sort=countwt=json json.nl=map作为选项,您可以看到排序丢失:

"dc_coverage": {
    "19th century": 1,
    "20th century": 1,
    "Detroit (Mich.)": 1,
    "Pennsylvania": 1,
    "United States": 5,
    "United States--Michigan--Detroit": 1,
    "United States--Washington, D.C.": 1
}

这里有更多有关使用json.nl=map时格式化JSON响应的信息: https : json.nl=map

如果有人尝试通过solr-php-client进行排序的快速答案:

$searchOptions = array('sort' => 'field_date desc');

删除通常在URL上加上的+号。 我花了一段时间才弄清楚,我正在对其进行编码并将其放置在整个地方...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM