Почему этот сорт в Solr не работает?

Мне нужно отсортировать по типу поля даты, имя которого «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); 

Это не работает, я не знаю, почему!

Все остальное отлично работает, возвращаются все правильные поля. Но сорт не работает.

Есть идеи?

благодаря

BTW: Поле «mod_date» содержит что-то вроде:

  2010-03-04T19:37:22.5Z 

РЕДАКТИРОВАТЬ:

Сначала я использую PHP для отправки этого файла в SolrPhpClient, который является другим php-файлом, называемым service.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).

Этот код ниже (также поверх этого Q) работает, но это потому, что я вставляю его в адресную панель вручную, а не через PHPclient. Но это только для отладки, мне нужно заставить его работать через PHPclient:

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

UPDATE (2010-03-08): Я пробовал коды Donovans (URL), и они работают нормально. Теперь я заметил, что это один из параметров, из-за которого «СОРТ» не работает. Этот параметр является параметром «wt». Если мы возьмем url из вершины этого 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: числа, чтобы найти все в базе данных MySql и получить всю другую информацию (например, это не информация, доступная для поиска).

Так упрощено: Search -> Solr возвращает все совпадения в массиве ID: nrs -> Id: числа из Solr совпадают с номерами идентификаторов в mysql db, поэтому я могу просто сделать простой матч снова для каждой записи с идентификатором сопоставляя ID из массива результатов Solr.

Я не использую 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.

Надеюсь, это приблизит вас к anser.

Используйте значения сеанса для сохранения параметров сортировки.

Быстрый ответ в случае, если кто-то пытается сортировать через solr-php-клиент:

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

Выровняйте знак +, который вы обычно ставите на URL. Мне потребовалось некоторое время, чтобы разобраться в этом, я его кодировал и помещал повсюду …

Возможно, это связано с параметром json.nl=map . Когда для ответа задано значение JSON с wt=json и json.nl=map , грани не сортируются, как ожидалось, с параметрами facet.sort или f.<field_name>.facet.sort=count|index .

например, с facet.sort=count и wt=json only, я получаю:

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

Здесь больше информации о форматировании ответа JSON при использовании json.nl=map : https://cwiki.apache.org/confluence/display/solr/Response+Writers#ResponseWriters-JSONResponseWriter