2009-07-03 17 views
11

Il codice sotto è dal Lucene In Azione libro (originariamente in Java). È per creare un elenco di documenti "consentiti" (dal punto di vista dell'autorizzazione dell'utente) per filtrare i risultati della ricerca con. Il problema è il metodo termsDocs.Read() non accetta il 'doc' e 'array freq' essere passati per riferimento, quindi sono ancora vuoto quando si tratta di definire il bit della matrice di bit.Come è possibile realizzare un filtro personalizzato con Lucene.net?

Qualcuno può aiuto, esempi di utilizzo di filtri personalizzati Lucene (soprattutto in .net) sembrano essere sottili sulla terra. Grazie.

public class LuceneCustomFilter : Lucene.Net.Search.Filter 
{ 
    string[] _luceneIds; 

    public LuceneCustomFilter(string[] luceneIds) 
    { 
     _luceneIds = luceneIds; 
    } 

    public override BitArray Bits(Lucene.Net.Index.IndexReader indexReader) 
    { 
     BitArray bitarray = new BitArray(indexReader.MaxDoc()); 

     int[] docs = new int[1]; 
     int[] freq = new int[1]; 

     for (int i = 0; i < _luceneIds.Length; i++) 
     { 
      if (!string.IsNullOrEmpty(_luceneIds[i])) 
      { 
       Lucene.Net.Index.TermDocs termDocs = indexReader.TermDocs(
        new Lucene.Net.Index.Term(@"luceneId", _luceneIds[i])); 

       int count = termDocs.Read(docs, freq); 

       if (count == 1) 
       { 
        bitarray.Set(docs[0], true); 
       } 
      } 
     } 

     return bitarray; 
    } 
} 

sto usando Lucene.net 2.0.0.4, ma l'interfaccia TermDocs appare ancora essere lo stesso nella sua ultima ramo qui: https://svn.apache.org/repos/asf/incubator/lucene.net/trunk/C%23/src/Lucene.Net/Index/TermDocs.cs

risposta

14

Ecco un esempio di lavoro di Lucene.NET utilizzando un filtro personalizzato si potrebbe dare un'occhiata a:

using System; 
using System.Collections; 
using Lucene.Net.Analysis; 
using Lucene.Net.Documents; 
using Lucene.Net.Index; 
using Lucene.Net.Search; 
using Lucene.Net.Store; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Directory index = new RAMDirectory(); 
     Analyzer analyzer = new KeywordAnalyzer(); 
     IndexWriter writer = new IndexWriter(index, analyzer, true); 

     Document doc = new Document(); 
     doc.Add(new Field("title", "t1", Field.Store.YES, 
      Field.Index.TOKENIZED)); 
     writer.AddDocument(doc); 
     doc = new Document(); 
     doc.Add(new Field("title", "t2", Field.Store.YES, 
      Field.Index.TOKENIZED)); 
     writer.AddDocument(doc); 

     writer.Close(); 

     Searcher searcher = new IndexSearcher(index); 
     Query query = new MatchAllDocsQuery(); 
     Filter filter = new LuceneCustomFilter(); 
     Sort sort = new Sort("title", true); 
     Hits hits = searcher.Search(query, filter, sort); 
     IEnumerator hitsEnumerator = hits.Iterator(); 

     while (hitsEnumerator.MoveNext()) 
     { 
      Hit hit = (Hit)hitsEnumerator.Current; 
      Console.WriteLine(hit.GetDocument().GetField("title"). 
       StringValue()); 
     } 
    } 
} 

public class LuceneCustomFilter : Filter 
{ 
    public override BitArray Bits(IndexReader indexReader) 
    { 
     BitArray bitarray = new BitArray(indexReader.MaxDoc()); 

     int[] docs = new int[1]; 
     int[] freq = new int[1]; 

     TermDocs termDocs = indexReader.TermDocs(
       new Term(@"title", "t1")); 

     int count = termDocs.Read(docs, freq); 
     if (count == 1) 
     { 
      bitarray.Set(docs[0], true); 
     } 
     return bitarray; 
    } 
} 
+0

fantastici, grazie per il vostro aiuto Darin. – Nick

2

un po 'confuso qui perché passando un array in effetti passalo per riferimento Per esempio seguente fascetta stamperà 10 10 10 10 10 mostra che i valori della matrice sono state aggiornate.

Mi manca qualcosa qui?

public void TestPassing() 
    { 
     int[] stuff = new int[] {5, 5, 5, 5}; 

     Add(stuff, 5); 
     for (int i = 0; i < stuff.Length; i++) 
     { 
      Console.Write(stuff[i]); 
     } 
    } 

    public void Add(int[] stuff, int x) 
    { 
     for(int i = 0; i < stuff.Length; i++) 
     { 
      stuff[i] = stuff[i] + x; 
     } 
    } 
+0

ho pensato che tu avessi ancora di utilizzare il modificatore 'ref', anche se un array è una variabile del tipo di riferimento. Sembra che io sono quello che manca qualcosa .. – Nick

Problemi correlati