2009-07-03 23 views
11

Poniższy kod pochodzi z książki Lucene In Action (pierwotnie w języku Java). Jest przeznaczony do budowania listy "dozwolonych" dokumentów (z punktu widzenia uprawnień użytkownika) w celu filtrowania wyników wyszukiwania. Problem polega na tym, że metoda termsDocs.Read() nie akceptuje tablic "doc" i "freq" przekazywanych przez referencję, więc nadal są puste, jeśli chodzi o ustawienie bitu w tablicy bitów.W jaki sposób zaimplementować niestandardowy filtr w Lucene.net?

Czy ktoś może pomóc, przykłady używania niestandardowych filtrów Lucene (zwłaszcza w .net) wydają się być cienkie na ziemi. Dzięki.

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

Używam Lucene.net 2.0.0.4, ale interfejs TermDocs nadal wydaje się być taka sama w najnowszej gałęzi tutaj: https://svn.apache.org/repos/asf/incubator/lucene.net/trunk/C%23/src/Lucene.Net/Index/TermDocs.cs

Odpowiedz

14

Oto przykład roboczych od Lucene.NET stosując filtr niestandardowy można spojrzeć na:

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

Fantastyczne, dzięki za pomoc, darin. – Nick

2

nieco mylić tutaj, ponieważ przekazywanie tablicy robi w rzeczywistości przekazać go przez odniesienie. Na przykład poniższy blurb wyświetli 10 10 10 10 10, pokazując, że wartości tablicy zostały zaktualizowane.

Czy tu czegoś brakuje?

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

Myślałam, że wciąż musiałem użyć „ref” modyfikator, mimo że tablica jest zmienna typu odniesienia. Wygląda na to, że to ja czegoś brakuje ... – Nick

Powiązane problemy