movemind
@movemind
Аналитик из Кнопки

Как искать в Sphinx с учетом прав доступа?

Всем привет!

Недавно стал использовать Sphinx. Столкнулся с задачей, решение, которой не нашел в документации.

Итак, задача: необходимо выполнять поиск в таблице с проверкой прав доступа, которые хранятся в другой таблице.

Как делаю сейчас:
1. индексирую таблицу с данными (1,5 млн записей)
2. при поиске от Sphinx'а получаю список ID
3. к этому списку делаю inner join c ID всех доступных пользователю записей (из таблицы security)

В текущем решении не устраивает:
1. нагружает СУБД
2. нужно чтобы поисковый сервер был максимально независим, чтобы при поиске сервер с данными нагружался по минимуму.

Возможное решение:
Создаем второй индекс прав доступа и при поиске объединяем результаты поиска из двух индексов (передаем дополнительно id пользователя).

Буду благодарен за вашу помощь!
  • Вопрос задан
  • 2837 просмотров
Решения вопроса 1
winbackgo
@winbackgo
Все зависит от того каким образом организованы эти права. У меня к примеру, права по группам. Индекс содержит атрибут sql_attr_multi = bigint usergroups from field. -1 все пользователи, далее группы: 0 анреги, 1, 2… Ну и потом ставлю фильтр при поиске [-1, curent_user_group].
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
karenishe
@karenishe
В индексы sphinx можно поместить любой запрос. Я так понял, что inner join вы делаете вне sphinx. Так сделайте такой запрос, который из sphinx уже вернет только те id, на которые у юзера есть права и все.
Ответ написан
Комментировать
@Ualde
Конечно, структуру вашей бд я не знаю, но если есть возможность обойтись без join'a — лучше это сделать.
А так пользователь karenishe прав. Сделайте запрос в самом теле source'a поиском сразу с запросом и в таблицу прав.
А-ля: sql_query= SELECT * FROM first_table INNER JOIN users ON…
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы