Как обычно, я обращаюсь к огромным интеллектуальным возможностям, которые являются пользовательской базой Stackoverflow, чтобы помочь решить проблему Lucene.NET, с которой я борюсь.Прежде всего, я полный нуб, когда дело доходит до Lucene и Lucene.NET, и, используя разрозненные учебники и фрагменты кода в Интернете, я собрал воедино следующее решение для моего сценария.
Сценарий
У меня есть индекс следующей структуры:
---------------------------------------------------------
| id | date | security | text |
---------------------------------------------------------
| 1 | 2011-01-01 | -1-12-4- | some analyzed text here |
---------------------------------------------------------
| 2 | 2011-01-01 | -11-3- | some analyzed text here |
---------------------------------------------------------
| 3 | 2011-01-01 | -1- | some analyzed text here |
---------------------------------------------------------
Мне нужно иметь возможность запрашивать текстовое поле, но ограничить результаты пользователями, которые имеют определенные roleId's.
Для достижения этой цели (после многих, многих поездок в Google) я использовал «поле безопасности» и фильтр Lucene, чтобы ограничить результирующий набор, как описано ниже:
class SecurityFilter : Lucene.Net.Search.Filter
{
public override System.Collections.BitArray Bits(Lucene.Net.Index.IndexReader indexReader)
{
BitArray bitarray = new BitArray(indexReader.MaxDoc());
for (int i = 0; i < bitarray.Length; i++)
{
if (indexReader.Document(i).Get("security").Contains("-1-"))
{
bitarray.Set(i, true);
}
}
return bitarray;
}
}
... а затем ...
Lucene.Net.Search.Sort sort = new Lucene.Net.Search.Sort(new Lucene.Net.Search.SortField("date", true));
Lucene.Net.Analysis.Standard.StandardAnalyzer analyzer = new Lucene.Net.Analysis.Standard.StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29);
Lucene.Net.Search.IndexSearcher searcher = new Lucene.Net.Search.IndexSearcher(Lucene.Net.Store.FSDirectory.Open(indexDirectory), true);
Lucene.Net.QueryParsers.QueryParser parser = new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_29, "text", analyzer);
Lucene.Net.Search.Query query = parser.Parse("some search phrase");
SecurityFilter filter = new SecurityFilter();
Lucene.Net.Search.Hits hits = searcher.Search(query, filter, sort);
Это работает как ожидалось и будет возвращать только документы с идентификаторами 1 и 3. Проблема в том, что на больших индексах этот процесс становится очень медленным.
Наконец, мой вопрос ... Есть ли у кого-нибудь какие-либо советы о том, как его ускорить, или есть альтернативное решение, которое было бы более эффективным, чем то, которое я здесь представил?