2009-07-03 10 views
11

Der folgende Code stammt aus dem Buch Lucene In Action (ursprünglich in Java). Es dient zum Erstellen einer Liste von "erlaubten" Dokumenten (aus Sicht der Benutzerberechtigungen) zum Filtern von Suchergebnissen mit. Das Problem ist, dass die Methode termsDocs.Read() die Arrays 'doc' und 'freq', die als Referenz übergeben werden, nicht akzeptiert. Daher sind sie immer noch leer, wenn es darum geht, das Bit im Bit-Array zu setzen.Wie implementieren Sie einen benutzerdefinierten Filter mit Lucene.net?

Kann jemand helfen, Beispiele für die Verwendung von Lucene benutzerdefinierte Filter (besonders in. Net) scheint dünn auf dem Boden zu sein. Vielen Dank.

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

Ich verwende Lucene.net 2.0.0.4, aber die TermDocs Schnittstelle erscheint hier noch das gleiche in der aktuellen Zweig zu sein: https://svn.apache.org/repos/asf/incubator/lucene.net/trunk/C%23/src/Lucene.Net/Index/TermDocs.cs

Antwort

14

Hier ist ein funktionierendes Beispiel für Lucene.NET einen benutzerdefinierten Filter verwenden Sie einen Blick vielleicht an:

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

Fantastisch, danke für deine Hilfe. – Nick

2

Ein bisschen verwirrt hier, weil Übergabe eines Arrays in der Tat tut übergeben Sie es als Referenz. Zum Beispiel druckt der folgende Klappentext 10 10 10 10 10, der anzeigt, dass die Array-Werte aktualisiert wurden.

Fehle ich hier etwas?

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

Vielleicht haben Sie immer noch die ‚ref‘ Modifikator verwenden musste, obwohl ein Array ist eine Referenztypvariable Sieht so aus, als wäre ich diejenige, der etwas fehlt. – Nick

Verwandte Themen