Я хочу проверить при поиске по индексу sphinx разрешение на чтение для пользователя, который ищет некоторые документы.
Например, у меня есть таблица документов с doc_id, doc_title и doc_is_global.С другой стороны, у меня есть таблица accessprivileges со структурой, такой как:
user_id, user_group_id, doc_id, doc_category_id
пользователи могут группироваться в «user_group» с идентификатором user_group_id, и документы эквивалентны в document_categories.
Таблица доступа может выглядеть следующим образом:
user_id, user_group_id, doc_id, doc_category_id
1, NULL, 1, NULL
NULL,12, NULL, 32
1, NULL, NULL, 31
NULL, 10, 1, NULL
Пользователь должен находить документы только с флагом is_globalустановлен в 1, или он имеет доступ по своему user_id, или по group_id, членом которого он является.
В простом MySQL я получаю правильный результат с помощью некоторых JOINs, таких как:
SELECT * from documents d
LEFT JOIN document_category dc ON dc.doc_id = d.doc_id
LEFT JOIN access a ON a.user_id = {$user} and a.doc_id = d.doc_id
LEFT JOIN access a ON a.category_id = dc.category_id and dc.group_id IN ({$groups})
[...]
В SphinxЯ знаю, я могу поместить несколько атрибутов в индексированный документ, но это не то, что я хочу.В моей продуктивной среде я также должен проверить, какой пользователь предоставил доступ для чтения, и только если он может это сделать, он становится доступным для чтения.В такой ситуации с несколькими атрибутами с использованием sphinx он возвращает что-то вроде:
access_user_id = (1,4,6,2) accessed_by_user = (1,5,3)
, поэтому нетвозможность проверить, кто дал разрешение на чтение, кому.Следующая проблема заключается в том, что Sphinx поддерживает только макс.Атрибуты 4gb на индекс.
Мне нужна подсказка для идеи построения индекса, чтобы отфильтровать результаты, которые пользователь не может видеть (возможно, с несколькими индексами?)