2016-09-08 4 views
0

ユーザーは、アクセス可能なグループでのみ利用可能なコンテンツを検索できる必要があります。検索は、アクセス権を持つすべてのグループにまたがっている必要があります。ユーザーによる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を含めるように検索インデックスを再インデックスすることが必要となります。

このユースケースを処理するより良い方法はありますか?

おかげ ロブ

+0

group_idが既に含まれていて、ユーザーが属するグループを知っている場合、なぜuser_idを含める必要がありますか? –

+0

@AndreiVolginこれにより、ユーザーは、所属するすべてのグループにわたってサイト全体を検索できます)。これは100年代のことかもしれません。クエリの一部としてgroup_idsのリストを渡すことをお勧めしますか? 100がある場合、100のOR問合せは高価ではないでしょうか? –

答えて

0

あなたの質問に対する簡単な答えはありません。あなたは、(a)典型的なユースケース、および(b)極端なケースについて計画する必要があります。

一般的なユーザーが1-3グループに属している場合は、group_idによる検索が最適なソリューションかもしれません。 1-2回の追加検索を行いますが、ユーザーがグループに参加するたびに退室するたびにすべての文書を索引付けする必要はありません。これは非常に高価です。

極端な場合に別の実装を使用できます。ユーザーがX個以上のグループに所属している場合は、キーワードに一致するすべての結果を取得し、group_idでフィルタリングする方が効率的です。

代替アプローチは、group_id/user_idに関係なく常にすべての結果を取得し、Memcacheに格納する方法です。その後、それらをメモリ内でフィルタリングすることができます。

ユーザーは同じキーワードを使用して検索する傾向があります。コーパスによっては、単語の1%が検索の99%を占めることがあります。多くのユーザーと十分なキャッシュがあれば、多くのキャッシュヒットが得られます。 1GBのキャッシュは、数十から数十万のクエリ結果に適合することに注意してください。このアプローチのさらなる利点は、すべてのクエリ、特にフレーズまたは複数のキーワードの検索を高速化することです。

+0

ご回答いただきありがとうございます。インデックス1GBのコストは2.00ドルです。送信されたコンテンツのデータ使用量がどのように計算されているかご存知ですか?私が意味することは、1KBのデータを提出してインデックスを作成すると、インデックスされた金額が増加するのですか?また、インデックスのコストもCPUのコストを考慮しているかどうか分かりますか?ありがとう –

+0

これはGoogleのサポートに関する質問です。私は、「インデックス作成」自体がインスタンスコストに含まれていないと想定します。私はしばらくの間、Search APIの価格を見ていません。 –

+0

クール、ありがとう。私はこれを受け入れたものとしてマークします。 –

関連する問題