为什么在Solr工作中不会出现这种情况?

时间:2010-03-04 19:06:24

标签: java php sql mysql database

我需要对日期字段类型进行排序,其名称为“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”)。

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

4 个答案:

答案 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=jsonjson.nl=map将响应设置为JSON,则使用facet.sortf.<field_name>.facet.sort=count|index选项按照预期对 进行排序。

e.g。只有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://cwiki.apache.org/confluence/display/solr/Response+Writers#ResponseWriters-JSONResponseWriter