2015-02-09 78 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); 

我不能说很具体的性能问题,但我们有几百个标识在我们的名单,也没有似乎因为我们添加它来影响查询时间。真的,它与搜索几百或几千字的新闻文章没有任何区别。