为什么Solr不会这样呢?

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

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

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

但我使用的是一个phpSolr客户端,它向Solr发送一个URL,发送的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); 

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

其他一切正常,返回所有正确的字段。 但这种方法不起作用。

有任何想法吗?

谢谢

BTW:字段“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-parameters(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)。

下面的代码(也在此Q之上)可以正常运行,因为我手动将其粘贴到地址栏中,而不是通过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的顶部获取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) ,只需删除“wt”参数,然后排序就可以了。 结果显示不同,从而使我的PHP代码无法识别我相信的结果。 我认为多诺万会知道这一点。 我猜测为了使PHPClient工作,结果必须是一个特定的结构,一旦我删除wt参数就会搞砸。

多诺万,请帮帮我…

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

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

我不使用Faceting,没有提升,没有相关性或其他花哨的东西。 我只按最新的分类放置排序,并为用户提供选项,以便以最便宜的价格排序。 而已。

然后我使用“fq”参数根据用户选择的类别对Solr中的不同字段进行查询(在本例中为“cars”,在我的语言中为“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 

与此查询相比,它将filter查询移动到主查询中:

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

看看是否有区别。 如果存在,则可能是如何使用缓存过滤查询的结果并通过solr进行排序的错误 – 这对客户端而言不是问题,而是solr服务本身。

希望这能让你更接近anser。

使用会话的值来保存排序参数。

如果有人试图通过solr-php-client排序,快速回答:

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

抛弃您通常会在URL上添加的+号。 我花了一段时间才弄明白,我正在对它进行编码并把它放在一起……

它可能与json.nl=map参数有关。 如果使用wt=jsonjson.nl=map将响应设置为JSON,则facet.sortf..facet.sort=count|index选项不会按预期对facet进行排序。

例如, 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, DC", 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, DC": 1 } 

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