Сортировка избыточности при извлечении записей MySQL с использованием упорядоченного вывода Sphinx Search - PullRequest
0 голосов
/ 17 ноября 2011

У меня есть таблица MySQL, которую я проиндексировал с помощью Sphinx, с кучей столбцов в качестве атрибутов, по которым я хочу, чтобы мои пользователи сортировали свои результаты поиска (например, по имени, рейтингу и т. Д.).

ИтакЯ говорю Sphinx сделать это (например, в PHP):

$sphinx = new SphinxClient();

// Retrieve $query, $sort_attr, and $order from $_GET    

$sphinx->SetMatchMode(SPH_MATCH_ANY);
$sphinx->SetArrayResult(true);

$sphinx->SetSortMode($order, $sort_attr);
$sphinx->SetLimits( /* something reasonable, <1000 */ );
$results_sphinx = $sphinx->Query($query, 'table');

Это работает, и я получаю свои упорядоченные результаты.

Я также хочу отобразить все атрибуты (и некоторые другиестолбцы, которые должны оставаться неиндексированными) как часть результатов поиска.Это означает, что мне нужно получить каждый элемент результатов поиска из БД.

Поэтому я выполняю следующий вызов MySQL:

SELECT id, colA, colB, [...] FROM table WHERE table.id IN ([IDs returned from Sphinx, in some sorted order])

Однако, даже если мой список идентификаторов вернулся изСфинкс находится в некотором отсортированном порядке в соответствии со столбцами атрибутов (например, в алфавитном порядке), WHERE IN будет возвращать результаты в порядке столбца индекса таблицы, который в этом случае является самими идентификаторами.

Единственная опция, которую я имею в виду, - это использовать ORDER BY:

SELECT id, colA, colB, [...] FROM table WHERE table.id IN ([IDs returned from Sphinx, in some sorted order]) ORDER BY [attribute] [DESC|ASC]

Это работает, но я только что заставил Sphinx и MySQL сортировать один и тот же набор данных для каждого экземпляра поиска.Это чувствует себя неоптимальным.Я не думаю, что могу оставить сортировку для последнего вызова MySQL, так как я собираюсь разбивать на страницы в своих результатах, поэтому идентификаторы, возвращаемые из Sphinx, должны быть в каком-то порядке для начала.

МожетStackOverflow найти мне способ избежать этой избыточности?Пожалуйста, выделите все, что я сделал выше.

Спасибо!

1 Ответ

2 голосов
/ 17 ноября 2011

Сколько идентификаторов вы возвращаете одновременно?Если это не так много, я бы предложил использовать MySQL ORDER BY FIELD как таковой

SELECT id, colA, colB, ... FROM table WHERE table.id IN (id1,id2,id3,...) ORDER BY FIELD (table.id,id1,id2,id3,....)

Я делаю то же самое для своих поисков и извлечений в Sphinx / MySQL, отлично работает, никогда не имел медленного запроса (хотя я получаю только от 6 до 12 удостоверений личности одновременно).

...