Lucene.net: Запрос и использование фильтра для ограничения результатов

Как обычно, я обращаюсь к огромному интеллектуальному потенциалу, которым является база пользователей 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.

Для этого я придумал (после многих, многих посещений 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. Проблема в том, что на больших индексах этот процесс становится очень медленным.

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

5
задан nokturnal 30 September 2011 в 15:24
поделиться