2016-09-08 5 views
0

У нас есть прецедент, когда пользователи должны иметь возможность искать контент, доступный только в группах, к которым у них есть доступ. Поиск должен осуществляться по всем группам, к которым у них есть доступ.Ограничение результатов поиска API GAE пользователем

Некоторые детали: Группа имеет много сообщений, и пользователь может иметь доступ к сотням групп и тысячам сообщений в каждой группе. Поиск «Foo» должен возвращать все группы с «Foo» в имени и всех сообщениях в пределах групп, к которым у них есть доступ, и иметь «Foo» в контенте.

То, как я думал об этом, заключается в том, чтобы иметь список user_id, связанный с каждым индексом документа, а затем включать user_id в строку запроса, чтобы убедиться, что у пользователя есть доступ. Как только результаты будут возвращены, мы можем сделать дополнительную проверку, чтобы увидеть, что они имеют доступ к контенту, прежде чем возвращать результаты.

Индекс документа что-то вроде этого:

fields = [ 
    search.TextField(name="data", value="some searchable stuff"), 
    search.AtomField(name="post_id", value="id of post"), 
    search.AtomField(name="group_id", value="id of group"), 
    search.AtomField(name="user_id", value=user_id_1), 
    search.AtomField(name="user_id", value=user_id_2), 
    #.... add the thousand other users who have access to the group (done in loop)  
] 

#then query run a user 123 would be as follows: 
results = index.search("data = Foo AND user_id = 123") 

Моя озабоченность в связи с вышеизложенным подходом: Каждый новый пользователь, который присоединяется к группе потребовалось бы индекс поиска перенумеровать включить их user_id по каждому документу ,

Есть ли лучший способ обращения с этим прецедентом?

Благодаря Роб

+0

Зачем вам нужно включать user_id, если вы уже включили group_id, и знаете, к каким группам принадлежит пользователь? –

+0

@AndreiVolgin, чтобы пользователь мог искать сайт по всем группам, к которым они принадлежат). Это может быть в 100-х годах. Вы предлагаете передать в список group_ids часть вашего запроса? Если есть 100, не будет ли 100 вопросов или запросов дорогостоящим? –

ответ

0

Там нет простого ответа на ваш вопрос. Вам необходимо запланировать (a) типичный прецедент и (b) крайние случаи.

Если типичный пользователь принадлежит к 1-3 группам, поиск по group_id может быть лучшим решением. Вы будете выполнять 1-2 дополнительных поиска, но вам не нужно будет повторно индексировать каждый документ каждый раз, когда пользователь присоединяется или выходит из группы, что является чрезмерно дорогостоящим.

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

Альтернативный подход - всегда получать все результаты независимо от group_id/user_id и хранить их в Memcache. Затем вы можете отфильтровать их в памяти.

Пользователи стремятся искать по тем же ключевым словам - в зависимости от вашего корпуса, 1% слов может составлять до 99% запросов. Если у вас много пользователей - и достаточно большой кеш, вы получите много кеш-хитов. Обратите внимание, что 1 ГБ кэша может соответствовать десяткам или даже сотням тысяч результатов запроса. Дополнительным преимуществом этого подхода является то, что он ускоряет выполнение всех запросов, особенно поиска по фразам или нескольким ключевым словам.

+0

Спасибо за ваш ответ. Я вижу, что стоимость индекса 1GB составляет 2,00 доллара. Вы знаете, как рассчитывается использование данных для представленного контента? Я имею в виду, если кто-то подает 1KB данных для индексирования, увеличивается ли индексированная сумма? Кроме того, есть ли у вас какие-либо идеи, связана ли стоимость индексации со стоимостью процессора? Спасибо –

+0

Это вопросы поддержки Google. Я бы предположил, что сама «индексация» не включена в стоимость экземпляра. Я не смотрел на их оценку для API поиска некоторое время. –

+0

Прохладный, спасибо.Я отмечу это как принятое. –

Смежные вопросы