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