[英]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=json
和json.nl=map
将响应设置为JSON时,使用facet.sort
或f.<field_name>.facet.sort=count|index
选项无法按预期对构面进行排序。
例如, facet.sort=count
使用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 : json.nl=map
如果有人尝试通过solr-php-client进行排序的快速答案:
$searchOptions = array('sort' => 'field_date desc');
删除通常在URL上加上的+号。 我花了一段时间才弄清楚,我正在对其进行编码并将其放置在整个地方...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.