2015-02-09 73 views
1

我們正在使用Sql Server 2012全文索引,但是我們希望將我們的數據庫移至Sql Azure。使用遷移工具,它告訴我們全文索引與Sql Azure不兼容(即使是預覽版的v12也不支持它,因此看起來並不像他們打算支持它)。使用Lucene.NET限制數據

因此,我們正在尋找替代品,迄今爲止我發現的最好的方法是使用Lucene.NET和AzureDirectory(https://azuredirectory.codeplex.com)。這將允許我們將索引存儲在blob存儲中,並將其緩存在本地託管網站的VM的文件系統上(也在Azure中)。

我們遇到的問題是,我們打算索引的數據是諸如新聞故事之類的項目,由於我們有一個發佈模型,所有用戶都無法看到這些新聞故事,所以只有部分用戶可以看到它們。在搜索新聞報道時使用全文索引,我們可以通過簡單地加入對他們可見的內容來限制使用搜索的數據,但是使用Lucene我們將無法做到這一點。

我們想出的想法是將新聞報道與索引中的新聞報道集合在一起,允許用戶查看新聞報道,恐怕我對Lucene非常陌生,而且我無法找到最佳方式然而

document.Add(new Field("Title", 
       news.Title, 
       Field.Store.YES, 
       Field.Index.ANALYZED, 
       Field.TermVector.NO)); 
    document.Add(new Field("Content", 
       news.Content, 
       Field.Store.YES, 
       Field.Index.ANALYZED, 
       Field.TermVector.NO)); 

,如果我們定義爲

IEnumerable<int> 

的用戶id的集合,我們怎樣才能把它們添加到新聞故事指數:要做到這一點,我們要添加索引的新聞報道,像這樣然後針對給定的用戶ID有效地搜索它們。此外,如果我們將100或1000個UserIds添加到lucene文檔中,性能會如何。有沒有比這條路更好的方式,因爲這可能是一個可怕的想法(可能是一個可怕的想法)?

回答

0

我在遷移到Azure時也遇到了這個問題,並以相同的權限模型結束。由於您的userIds是整數,並且不會有特殊字符,因此只要您輸入一個字符串,就可以依賴許多Lucene(.net)分析器(如StandardAnalyzer和WhitespaceAnalyzer)將ID列表分成多個項。根據分析儀的分割情況,用空格或逗號分隔每個ID。

你應該能夠做一些簡單的像這樣指數的ID ...

IEnumerable<int> userIds = new int[] { 123, 456, 789 }; 

document.Add(new Field("AllowedUserIDs", 
String.Join(" ", userIds), 
Field.Store.NO, 
Field.Index.ANALYZED_NO_NORMS)); 

然後,只需確保用TermQuery匹配整個條款(IDS)來查詢。喜歡的東西...

int currentUserID = 123; 
string queryString = "airplane"; 

BooleanQuery query = new BooleanQuery(); 
query.Add(new TermQuery(new Term("AllowedUserIDs", currentUserID.ToString())), Occur.MUST); 
query.Add(new TermQuery(new Term("Title", queryString)), Occur.SHOULD); 
query.Add(new TermQuery(new Term("Content", queryString)), Occur.SHOULD); 

我不能說很具體的性能問題,但我們有幾百個標識在我們的名單,也沒有似乎因爲我們添加它來影響查詢時間。真的,它與搜索幾百或幾千字的新聞文章沒有任何區別。