使用Lucene.NET限制数据

时间:2015-02-09 08:41:32

标签: full-text-search azure-sql-database lucene.net

我们正在使用Sql Server 2012全文索引,但是我们希望将数据库移动到Sql Azure。使用迁移工具,它告诉我们全文索引与Sql Azure不兼容(即使v12在预览中也不支持它,因此它看起来不像是支持它)。

因此我们正在寻找替代方案,迄今为止我发现的最好的方法是将Lucene.NET与AzureDirectory(https://azuredirectory.codeplex.com)一起使用。这将允许我们将索引存储在blob存储中,并将其本地缓存在托管网站的VM的文件系统上(也在Azure中)。

我们遇到的问题是我们打算索引的数据是诸如新闻故事之类的项目,因为我们拥有的发布模型限制了只有一部分用户才能看到的项目。在搜索新闻报道时使用全文索引,我们可以使用简单的联接来限制使用搜索的数据,但是使用Lucene,我们将无法执行此操作。

我们提出的想法是在索引中收集新闻故事,其中包含允许查看该新闻故事的UserIds集合,我担心我对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));

但是,如果我们将userIds的集合定义为

IEnumerable<int> 

我们如何将这些添加到新闻报道索引中,然后针对给定的用户ID有效地搜索它们。此外,如果我们在lucene文档中添加100或1000个UserId,性能会受到什么影响。有没有比走这条路更好的方法,因为这可能是一个可怕的想法(可能是一个可怕的想法)?

1 个答案:

答案 0 :(得分: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查询以匹配整个术语(ID)。有点像...

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);

我无法专门针对性能问题发言,但我们的列表中有几百个ID,因为我们添加了它,它似乎不会影响查询时间。真的,它只是搜索几百或几千字的新闻文章。