2016-09-08 34 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

爲什麼你需要包含user_id,如果你已經包含group_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

很酷,謝謝。我會將此標記爲已接受。 –