Come al solito, mi rivolgo all'enorme potenza del cervello che è la base di utenti StackOverflow per risolvere un problema Lucene.NET con cui sto combattendo. Prima di tutto, sono un noob completo quando si tratta di Lucene e Lucene.NET e utilizzando i tutorial sparsi e gli snippet di codice online, ho messo insieme la soluzione seguente per il mio scenario.Lucene.net: interrogazione e utilizzo di un filtro per limitare i risultati
Lo scenario
Ho un indice della seguente struttura:
---------------------------------------------------------
| 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 |
---------------------------------------------------------
ho bisogno di essere in grado di interrogare il campo di testo, ma limitare i risultati per gli utenti che dispongono di ID ruolo specifico di.
Quello che mi è venuta per raggiungere questo obiettivo (dopo molti, molti viaggi a Google) è quello di utilizzare un "campo della sicurezza" e un filtro Lucene per limitare il set di risultati come indicato di seguito:
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;
}
}
. .. e poi ...
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);
questo funziona come previsto e sarebbe tornato solo i documenti con l'ID di di 1 e 3. Il problema è che su grandi indici di questo processo diventa molto lento.
Infine, la mia domanda ... Qualcuno là fuori ha qualche consiglio su come accelerarlo o avere una soluzione alternativa che sarebbe più efficiente di quella che ho presentato qui?
È possibile modificare il formato dell'indice? – goalie7960
Sì, a questo punto qualsiasi cosa può essere modificata. – nokturnal