我需要对日期字段类型进行排序,其名称为“mod_date”。
它在浏览器地址栏中的工作方式如下:
http://localhost:8983/solr/select/?&q=bmw&sort=mod_date+desc
但是我使用的是一个向Solr发送URL的phpSolr客户端,发送的网址为:
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)。
下面这段代码(也在这个问题的顶部)可以运行,但那是因为我手动将其粘贴到地址栏中,而不是通过PHPclient。但这只是为了调试,我需要通过PHPclient来实现它:
http://localhost:8983/solr/select/?&q=bmw&sort=mod_date+des // Not via phpclient, but works
更新(2010-03-08):
我尝试过Donovans代码(网址)并且工作正常。
现在,我注意到它是导致'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:数字数组(对于搜索条件的所有匹配)。然后我使用这些ID:数字来查找MySql数据库中的所有内容并获取所有其他信息(例如,不是可搜索的信息)。
如此简化:搜索 - > Solr以ID数组返回所有匹配项:nrs - > Id:Solr中的数字与MySql数据库中的Id数字相同,因此我可以在每个记录中再次进行简单匹配,ID与Solr结果数组中的ID匹配。
我不使用Faceting,没有提升,没有相关性或其他花哨的东西。我只按最新的分类放置,并给用户选择也按最便宜的价格排序。没什么。
然后我使用“fq”参数对Solr中的不同字段进行查询,具体取决于用户选择的类别(在本例中为“cars”,在我的语言中为“Bilar”)。
我在这里真的遇到了这个问题...... 感谢您的帮助
答案 0 :(得分:2)
正如堆栈溢出注释中所指出的,您的浏览器查询与基于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服务本身。
希望这能让你更接近anser。
答案 1 :(得分:0)
使用会话的值来保存排序参数。
答案 2 :(得分:0)
如果有人试图通过solr-php-client排序,快速回答:
$searchOptions = array('sort' => 'field_date desc');
抛弃您通常会在网址上添加的+号。我花了一段时间才弄清楚,我正在对它进行编码并把它放在一起......
答案 3 :(得分:0)
它可能与json.nl=map
参数有关。如果使用wt=json
和json.nl=map
将响应设置为JSON,则使用facet.sort
或f.<field_name>.facet.sort=count|index
选项按照预期对 进行排序。
e.g。只有facet.sort=count
和wt=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=count
,wt=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://cwiki.apache.org/confluence/display/solr/Response+Writers#ResponseWriters-JSONResponseWriter