21

मैं अनुक्रमण और दस्तावेज खोज के लिए Lucene.Net उपयोग कर रहा हूँ, और मैं बनाने या खोलने के लिए एक सूचकांक यदि कोई मौजूद है निम्नलिखित कोड का उपयोग कर रहा:कैसे पहचानें कि एक फ़ोल्डर में Lucene.Net अनुक्रमणिका मौजूद है या नहीं?

IndexWriter writer = new IndexWriter(@"C:\index", new StandardAnalyzer(), !IndexExists); 

... 

private bool IndexExists 
{ 
    get 
    { 
     return ?? 
    } 
} 

अब, एक सरल तरीके से IndexExists लागू कर सकते हैं? मुझे फेंकने के लिए किसी भी अपवाद की आवश्यकता नहीं है।

उत्तर

37

स्थैतिक विधि IndexReader.IndexExists (स्ट्रिंग पथ) (या इसके ओवरलोड में से एक) बहुत उपयुक्त लगता है।

3

आप केवल उस कन्स्ट्रक्टर का उपयोग कर सकते हैं जो बुलियन परम नहीं लेता है। यदि कोई वहां मौजूद है या यदि कोई अस्तित्व नहीं है तो वह एक मौजूदा इंडेक्स खुल जाएगा।

जावा प्रलेखन लिंक (Lucene.Net के लिए एक ही):

निजी bool IndexExists { प्राप्त करें: http://lucene.apache.org/java/2_3_1/api/org/apache/lucene/index/IndexWriter.html#IndexWriter(org.apache.lucene.store.Directory, org.apache.lucene.analysis.Analyzer)

+0

Lucene.net में यह अधिभार नहीं है। – Marek

+1

लुसेन.Net का कौन सा संस्करण अधिभार खो रहा है? यह 2.4 में है। –

+0

मैं "सीधे जावा" ल्यूसीन का उपयोग कर रहा हूं। 4.10 में इंडेक्सवाइटर। + में केवल एक कन्स्ट्रक्टर है। लेकिन मुझे समझ में नहीं आता कि आप अपने समाधान से क्या पूछना चाहते हैं: यह पता लगाएं कि पहले से ही एक इंडेक्स है या नहीं। –

0

मैं यहाँ भी सफलता के बिना इस anwser खोजने की कोशिश और कैसे मैं अपने कोड में उपयोग किया जाता है { वापसी इंडेक्स डायरेक्टरी। फ़ाइलइक्सिस्ट ("सेगमेंट.जेजेन"); } }

+0

चालाक ... और संभवतः वर्तमान में सबसे अच्छा तरीका (मेरा उत्तर देखें: 4.10। + ने 4.0 के बाद से 'DirectoryReader.indexExists() 'के विनिर्देश को बदल दिया है। +)। लेकिन निश्चित रूप से, जैसा कि मुझे यकीन है कि आप जानते हैं, आपका समाधान संस्करण परिवर्तनों के लिए बहुत कमजोर है। प्रत्येक नए संस्करण की जांच करनी होगी! –

4

< 4.0 में IndexReader.indexExists(org.apache.lucene.store.Directory)

> 4.0 में है DirectoryReader.indexExists(org.apache.lucene.store.Directory)

0

मुझे पता है कि यह एक पुरानी प्रविष्टि है, लेकिन क्या शॉन बढ़ई पोस्ट पूरी तरह से सही है और इस निर्माता में भी मौजूद है लुसीन .NET का नवीनतम संस्करण। इंडेक्सवाइटर क्लास के लिए प्रलेखन यहां पाया जा सकता है: http://lucenenet.apache.org/docs/3.0.3/d2/d1d/class_lucene_1_1_net_1_1_index_1_1_index_writer.html#af4620c14320934601058e0e9cac9bfab

0

व्हाउप्स!

यह "सीधे जावा" लुसीन है, लेकिन यह अन्य किस्मों पर भी लागू हो सकता है।

Lucene में 4.0.0 DirectoryReader.indexExists() के लिए एपीआई का कहना है

रिटर्न सही एक सूचकांक निर्दिष्ट निर्देशिका में मौजूद रहने पर।

लेकिन Lucene 4.10.2 में DirectoryReader.indexExists() के लिए एपीआई

रिटर्न सच कहते हैं अगर एक सूचकांक संभावना निर्दिष्ट निर्देशिका में मौजूद है। नोट एक भ्रष्ट सूचकांक मौजूद है कि, या यदि करने की प्रक्रिया में एक सूचकांक

करने से ... हाँ, यह मध्य वाक्य टूट जाता है। एनबी मैंने स्रोत से सीधे अपना जावाडोक संकलित किया, लेकिन ऑनलाइन अध्याय में एक ही अधूरा वाक्यांश देखा जा सकता है। इतना ही नहीं, लेकिन मैंने ल्यूसीन 6.0.0 एपीआई देखा, और यह बिल्कुल वही है।

"रिटर्न" वाक्यांश तथापि है:

सच एक सूचकांक मौजूद; झूठी अन्यथा

... लेकिन मुझे वर्तमान में विश्वास है कि एक खाली निर्देशिका कभी-कभी (?) true (मेरे यूनिट परीक्षण से) लौटाएगी। वैसे भी, मैं इस पर भरोसा नहीं करता।

यदि आप एक खाली निर्देशिका पर IndexReader बनाते हैं, तो ऐसा लगता है कि इसके सभी विधियां अपवाद फेंकने के बिना वापस आ जाएंगी। आप indexReader.numDocs() पर जा सकते हैं, और यह 0 वापस आ जाएगा, लेकिन यह साबित नहीं करता है कि वहां कोई अनुक्रमणिका नहीं है, केवल Document एस नहीं है। निश्चित रूप से, आपकी आवश्यकताओं के आधार पर पर्याप्त हो सकता है।

इसी प्रकार, आप IndexReader से बना सकते हैं, और आप IndexWriter बना सकते हैं। इनमें से कोई भी खाली निर्देशिका के साथ कोई स्पष्ट समस्या नहीं होगी।

बेहतर समाधान:

try { 
     directoryReader = DirectoryReader.open(fsDir); 
    } catch (org.apache.lucene.index.IndexNotFoundException e) { 
     ... 
    } 

यह प्रतीत होता है, जहाँ तक मैं बता सकता हूँ, विश्वसनीय होने के लिए।

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

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