ユーザーは、アクセス可能なグループでのみ利用可能なコンテンツを検索できる必要があります。検索は、アクセス権を持つすべてのグループにまたがっている必要があります。ユーザーによるGAE検索APIの制限
詳細: グループには多数の投稿があり、ユーザーは各グループ内の何百ものグループと数千の投稿にアクセスできます。 "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を含めるように検索インデックスを再インデックスすることが必要となります。
このユースケースを処理するより良い方法はありますか?
おかげ ロブ
group_idが既に含まれていて、ユーザーが属するグループを知っている場合、なぜuser_idを含める必要がありますか? –
@AndreiVolginこれにより、ユーザーは、所属するすべてのグループにわたってサイト全体を検索できます)。これは100年代のことかもしれません。クエリの一部としてgroup_idsのリストを渡すことをお勧めしますか? 100がある場合、100のOR問合せは高価ではないでしょうか? –