2011-03-25 5 views
6

मैं आंतरिक अखंडता को बनाए रखने के प्रयोजनों के लिए एक प्रश्न करने के लिए देख रहा हूं; उदाहरण के लिए, इंडेक्स से किसी विशेष फ़ील्ड/वैल्यू के सभी निशान हटा दें। इसलिए यह महत्वपूर्ण है कि मुझे सभी मेल खाने वाले दस्तावेज़ (न केवल शीर्ष एन दस्तावेज़) मिलते हैं, लेकिन वे जिस क्रम में लौटाए जाते हैं वह अप्रासंगिक है।ल्यूसीन में एक प्रश्न से सभी मिलान दस्तावेजों को पुनर्प्राप्त करने का सबसे प्रभावी तरीका क्या है?

दस्तावेज़ों के मुताबिक, ऐसा लगता है कि मुझे Searcher.Search(Query, Collector) विधि का उपयोग करने की आवश्यकता है, लेकिन कलेक्टर क्लास में कोई भी निर्माण नहीं किया गया है जो मुझे चाहिए।

मैं इस उद्देश्य के लिए अपने खुद के कलेक्टर प्राप्त करना चाहिए? ऐसा करने पर मुझे ध्यान में रखने की क्या ज़रूरत है?

+0

ध्यान में रखें यदि आप सभी परिणाम वापस करना चाहते हैं: http: //forums.alfresco.com/en/viewtopic.php?t=13381 –

+0

@Rodrigo क्या आप थोड़ा और विशिष्ट हो सकते हैं? मैंने उस धागे को पढ़ा लेकिन ऐसा लगता है कि अनुमति जांच के साथ ऐसा करना है। क्या आप समझा सकते हैं कि यह मेरे प्रश्न के लिए प्रासंगिक है? – devios1

उत्तर

4

बाहर कर देता है यह था बहुत आसान की तुलना में मैं उम्मीद थी। मैंने अभी http://lucene.apache.org/java/2_9_0/api/core/org/apache/lucene/search/Collector.html पर उदाहरण कार्यान्वयन का उपयोग किया है और एक सूची में Collect() विधि को पारित दस्तावेज़ संख्या दर्ज की है, इसे सार्वजनिक Docs संपत्ति के रूप में उजागर किया है।

मैं तो बस इस संपत्ति पुनरावृति, संख्या वापस Searcher को पारित करने के लिए उचित Document पाने के लिए:

var searcher = new IndexSearcher(reader); 
var collector = new IntegralCollector(); // my custom Collector 
searcher.Search(query, collector); 
var result = new Document[ collector.Docs.Count ]; 
for (int i = 0; i < collector.Docs.Count; i++) 
    result[ i ] = searcher.Doc(collector.Docs[ i ]); 
searcher.Close(); // this is probably not needed 
reader.Close(); 

अब तक यह प्रारंभिक परीक्षणों में ठीक काम कर रहा है।

अद्यतन: यहाँ IntegralCollector के लिए कोड है:

internal class IntegralCollector: Lucene.Net.Search.Collector { 
    private int _docBase; 

    private List<int> _docs = new List<int>(); 
    public List<int> Docs { 
     get { return _docs; } 
    } 

    public override bool AcceptsDocsOutOfOrder() { 
     return true; 
    } 

    public override void Collect(int doc) { 
     _docs.Add(_docBase + doc); 
    } 

    public override void SetNextReader(Lucene.Net.Index.IndexReader reader, int docBase) { 
     _docBase = docBase; 
    } 

    public override void SetScorer(Lucene.Net.Search.Scorer scorer) { 
    } 
} 
+1

बस अपने 'SetNextReader' को पास किए गए दस्तावेज़ बॉक्स का उपयोग करना याद रखें, क्योंकि' संग्रह 'पर पास की गई दस्तावेज़ आईडी वर्तमान पाठक (' SetNextReader' से) के लिए विशिष्ट है। शीर्षतम पाठक के साथ उपयोग करने के लिए आईडी की गणना करते समय आपको (docbase + doc) का उपयोग करने की आवश्यकता होगी, जो आपके 'इंडेक्सशियरर' को खोलते समय उपयोग किया जाता है। – sisve

+0

इसके अलावा, अगर आप मेल खाने वाले दस्तावेजों को हटाना चाहते हैं तो 'इंडेक्सवाइटर। डिलीट दस्तावेज़ (क्वेरी)' के बारे में मत भूलना। – sisve

+0

@ सिमॉन - धन्यवाद मैंने पाया कि खुद को बाहर निकाला, जब मैंने गेटकी परिणाम प्राप्त करना शुरू किया। इसके अलावा, हटाना सिर्फ एक उदाहरण था, मुझे वास्तव में अपने असली एप्लिकेशन में दस्तावेज़ों को पुनर्प्राप्त करने की आवश्यकता है। – devios1

0

एक हिट कलेक्टर लिखने के लिए कोई ज़रूरत नहीं है, तो आप सिर्फ सूचकांक में सभी दस्तावेज वस्तुओं को पाने के लिए देख रहे हैं। बस 0 से maxDoc के पाश() और, प्रत्येक दस्तावेज़ आईडी पर reader.document() फोन दस्तावेजों कि पहले से ही नष्ट हो जाती हैं छोड़ सुनिश्चित करते हुए:

for (int i=0; i<reader.maxDoc(); i++) { 
    if (reader.isDeleted(i)) 
     continue; 
    results[i] = reader.document(i); 
} 
+0

धन्यवाद, लेकिन मुझे वास्तव में एक क्वेरी करने में दिलचस्पी है, न केवल इंडेक्स में सभी दस्तावेज प्राप्त करना। – devios1

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

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