Почему такого не происходит в Solr? - PullRequest
0 голосов
/ 04 марта 2010

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

EDIT:

Сначала я использую 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

ОБНОВЛЕНИЕ (2010-03-08): Я пробовал коды Донована (URL), и они работают нормально. Теперь я заметил, что это один из параметров, заставляющий 'SORT' не работать. Этот параметр является параметром "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 совпадают с числами Id в базе данных MySql, поэтому я могу просто выполнить простое сопоставление каждой записи с идентификатором, совпадающим с идентификатором из массива результатов Solr.

Я не использую Faceting, без бустинга, без релевантности и прочего. Я сортирую только по последнему объявлению и даю пользователям возможность сортировать по самой низкой цене. Ничего больше.

Затем я использую параметр «fq» для выполнения запросов к различным полям в Solr в зависимости от категории, выбранной пользователями (например, «автомобили» в данном случае, которая на моем языке - «Билар»).

Я действительно застрял здесь с этой проблемой ... Спасибо за помощь

Ответы [ 4 ]

2 голосов
/ 05 марта 2010

Как указано в комментариях о переполнении стека, ваш браузерный запрос отличается от вашего 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.

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

0 голосов
/ 23 января 2017

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

например. с 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 при использовании json.nl=map: https://cwiki.apache.org/confluence/display/solr/Response+Writers#ResponseWriters-JSONResponseWriter

0 голосов
/ 29 декабря 2010

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

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

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

0 голосов
/ 08 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...