2012-03-19 42 views
0

我要檢查,同時通過獅身人面像指數搜索中誰是尋找一些文件的用戶的讀取權限使用。獅身人面像搜索引擎與訪問權限表

對於examle我有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分組。

Access表可能看起來像:

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我得到一些正確的結果JOIN的一樣:

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}) 
    [...] 

在獅身人面像,我知道,我可以把多個屬性的索引文件,但是是不是我想要的。在我的生產環境中,我還要檢查哪個用戶授予了讀取權限,並且只有當他能夠這樣做時,用戶才能成爲讀取權限。 製造使用獅身人面像多個屬性返回類似這種情況:

access_user_id =(1,4,6,2)accessed_by_user =(1,5,3)

所以沒有可能性檢查誰給誰閱讀權限。接下來的問題是獅身人面像只支持最大。每個索引4gb屬性。

我需要一些暗示一個想法來建立索引過濾掉用戶不允許看到的結果(也許有多個索引嗎?)

回答

2

那麼你可以索引這與

sql_query = 
    SELECT d.doc_id, ... 
    GROUP_CONCAT(a.user_id) AS access_user_id, 
    GROUP_CONCAT(a.user_group_id) AS access_user_group_id 
    FROM documents d 
    LEFT JOIN document_category dc ON (dc.doc_id = d.doc_id) 
    LEFT JOIN access a ON (a.doc_id = d.doc_id OR a.doc_category_id = dc.category_id) 
    GROUP BY doc_id 

然後可以對

$cl->setSelect("*, IF(IN({$user},access_user_id),1,0)+IF(IN({$group},access_user_group_id),1,0) AS myint"); 
$cl->setFilter('myint',array(1,2)); 

下一個問題是過濾器是獅身人面像只支持最大。每個索引4gb屬性。

獅身人面像僅支持4GB的字符串屬性每個索引。你確定MVA屬性有這樣的限制嗎?

在anycase,如果有太多的屬性 - 限制每個索引。因此,分片索引部分:)


由於運行與最大長度在GROUP CONCAT問題,最簡單的將probabyl是使用MVA查詢。

查看的文檔爲它http://sphinxsearch.com/docs/current.html#conf-sql-attr-multi

在那裏可以定義一個查詢以獲取用於直接在MVA中的數據,避免了使用GROUP_CONCAT/GROUP_BY的

sql_query = SELECT d.doc_id, ... FROM documents d 
sql_attr_multi = uint access_user_id from query; SELECT DISTINCT doc_id, a.user_id FROM documents d 
    LEFT JOIN document_category dc ON (dc.doc_id = d.doc_id) 
    LEFT JOIN access a ON (a.doc_id = d.doc_id OR a.doc_category_id = dc.category_id) 
sql_attr_multi = uint access_user_group_id from query; SELECT DISTINCT doc_id, a.user_group_id FROM documents d 
    LEFT JOIN document_category dc ON (dc.doc_id = d.doc_id) 
    LEFT JOIN access a ON (a.doc_id = d.doc_id OR a.doc_category_id = dc.category_id) 

(大概可以優化這些查詢一個位,但至少應該顯示如何開始)

+0

感謝您的回覆,您給了我正確的提示。現在我遇到了group_concat_max_length的問題。在某些情況下,可能會有一些文檔與成千上萬的用戶分享。我認爲它可以在存儲所有數據的單獨表格中使用。在Oracle DBMS中,我將使用動態查詢構建pl/sql過程,並遍歷access_user表等(包dbms_sql)以獲取分塊數據並將其插入臨時表中。我也可以用php做到這一點,但我認爲它不是最好的主意。你有沒有2提示讓我解決mysql的問題? – take 2012-03-24 10:59:58

+0

編輯答案以包含使用GROUP_CONCAT的替代項。 – barryhunter 2012-03-24 16:51:43

+0

>>如此將索引分成部分
如何完成? – 2015-05-20 11:23:27