2009-07-03 14 views
11

नीचे दिया गया कोड ल्यूसीन इन एक्शन बुक (मूल रूप से जावा में) से है। यह खोज परिणामों को फ़िल्टर करने के लिए 'अनुमत' दस्तावेज़ों (उपयोगकर्ता अनुमति बिंदु से) की एक सूची बनाने के लिए है। समस्या शब्द है Docs.Read() विधि संदर्भ द्वारा पारित होने के लिए 'doc' और 'freq' arrays को स्वीकार नहीं करती है, इसलिए बिट सरणी में बिट सेट करने के लिए वे अभी भी खाली हैं।आप Lucene.net के साथ एक कस्टम फ़िल्टर कैसे कार्यान्वित करते हैं?

क्या कोई मदद कर सकता है, लुसीन कस्टम फ़िल्टर (विशेष रूप से .net) का उपयोग करने के उदाहरण जमीन पर पतले लगते हैं। धन्यवाद।

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

मैं Lucene.net 2.0.0.4 का उपयोग कर रहा है, लेकिन TermDocs इंटरफ़ेस अभी भी नवीनतम शाखा यहाँ में एक ही प्रतीत होता है: https://svn.apache.org/repos/asf/incubator/lucene.net/trunk/C%23/src/Lucene.Net/Index/TermDocs.cs

उत्तर

14

यहाँ Lucene.NET की एक काम उदाहरण के लिए एक कस्टम फिल्टर का उपयोग कर आप को देखो दे सकता है:

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

शानदार, आपकी मदद डारिन के लिए धन्यवाद। – Nick

2

थोड़ा यहाँ उलझन में है क्योंकि एक सरणी से गुजर रहा है, वास्तव में करता है संदर्भ द्वारा इसे पास करें। उदाहरण के लिए निम्न ब्लर्ब 10 10 10 10 10 प्रिंट करेगा जो दिखाता है कि सरणी मान अपडेट किए गए हैं।

क्या मुझे यहां कुछ याद आ रही है?

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

मैंने सोचा था कि तुम अब भी 'रेफरी' संशोधक का इस्तेमाल किया था, भले ही एक सरणी है एक संदर्भ प्रकार चर। ऐसा लगता है कि मैं वह हूं जो कुछ खो रहा है .. – Nick

संबंधित मुद्दे