2015-02-09 2 views
1

Мы используем полнотекстовое индексирование Sql Server 2012, однако мы хотели бы переместить нашу базу данных в Sql Azure. Используя инструмент миграции, мы говорим, что полнотекстовое индексирование несовместимо с Sql Azure (даже v12, который находится в предварительном просмотре, не поддерживает его, поэтому он не выглядит так, как будто он намерен его поддерживать).Ограничение данных с Lucene.NET

Из-за этого мы рассматриваем альтернативы и лучшее, что я нашел до сих пор, использует Lucene.NET с AzureDirectory (https://azuredirectory.codeplex.com). Это позволит нам хранить индекс в хранилище blob и кэшировать его локально в файловой системе виртуальных машин, которые размещают веб-сайты (также в 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> 

Как мы могли бы добавить их к индексу новости сюжета а затем эффективно искать их для данного идентификатора пользователя. Кроме того, какова будет производительность, если мы добавляем 100 или 1000 пользователей UserIds против lucene-документа. Есть ли лучший способ пойти, чем по этой дороге, поскольку это может быть ужасная идея (возможно, это ужасная идея)?

ответ

0

Я также столкнулся с этой проблемой при переходе на Azure и получил ту же самую модель разрешений. Поскольку ваши userIds являются целыми числами и не будут иметь специальных символов, вы можете положиться на многие из анализаторов Lucene (.net), таких как StandardAnalyzer и WhitespaceAnalyzer, чтобы разбить список идентификаторов на термины, пока вы вводите строку. Просто отделяйте каждый идентификатор пробелом или запятой в зависимости от того, что будет разделять анализатор.

Вы должны быть в состоянии сделать что-то простое, как это индексировать идентификаторы ...

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, чтобы соответствовать целые термины (идентификаторы). Что-то вроде ...

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

Я не могу говорить очень конкретно к проблемам производительности, но у нас есть несколько сотен идентификаторов в наших списках, и это, казалось, не повлияет на время запроса, так как мы добавили его. На самом деле это ничем не отличается от поиска в нескольких сотнях или нескольких тысячах новостных статей.

Смежные вопросы