2010-02-22 7 views
20

मेरे पास एक दस्तावेज़ के साथ ल्यूसीन इंडेक्स में संग्रहीत कुछ दस्तावेज़ हैं। मैं इंडेक्स में संग्रहीत सभी डॉकआईड्स प्राप्त करना चाहता हूं। एक समस्या भी है। दस्तावेजों की संख्या लगभग 300 000 है इसलिए मैं इस दस्तावेज़ को आकार 500 के हिस्सों में प्राप्त करना पसंद करूंगा। क्या ऐसा करना संभव है?लुसीन इंडेक्स में संग्रहीत दस्तावेज़ों के माध्यम से पुन: प्रयास करना संभव है?

उत्तर

42
IndexReader reader = // create IndexReader 
for (int i=0; i<reader.maxDoc(); i++) { 
    if (reader.isDeleted(i)) 
     continue; 

    Document doc = reader.document(i); 
    String docId = doc.get("docId"); 

    // do something with docId here... 
} 
+1

क्या होगा अगर (reader.isDeleted (i)) याद आ रही है होता है? –

+0

हटाए गए() चेक के बिना, आप उन दस्तावेज़ों के लिए आईडी आउटपुट करेंगे जिन्हें पहले से हटाया गया था – bajafresh4life

+0

ऊपर से टिप्पणी पूरी करने के लिए। इंडेक्स में परिवर्तन तब किया जाता है जब इंडेक्स को फिर से खोल दिया जाता है .इस हटाया गया (i) यह गारंटी देना आवश्यक है कि दस्तावेज मान्य हैं। –

2

दस्तावेज़ संख्या (या आईडी) 0 से IndexReader.maxDoc() - 1 के बाद की संख्या होगी। ये संख्याएं लगातार नहीं हैं और केवल खुले इंडेक्स रीडर के लिए मान्य हैं। आप की जांच कर सकता है, तो दस्तावेज़ IndexReader.isDeleted (पूर्णांक documentNumber) विधि के साथ हटा दिया जाता है

14

Lucene 4

जानकारी के लिए इस पेज पर
Bits liveDocs = MultiFields.getLiveDocs(reader); 
for (int i=0; i<reader.maxDoc(); i++) { 
    if (liveDocs != null && !liveDocs.get(i)) 
     continue; 

    Document doc = reader.document(i); 
} 

देखें Lucene-2600: https://lucene.apache.org/core/4_0_0/MIGRATE.html

+0

यह किसी अन्य उपयोगकर्ता द्वारा वापस लुढ़का गया था लेकिन मूल संपादक सही था, liveDocs शून्य हो सकता है – bcoughlan

0

यदि आप उपरोक्त उदाहरणों में .document (i) का उपयोग करते हैं और हटाए गए दस्तावेज़ों पर छोड़ देते हैं तो सावधान रहें यदि आप पेजिंग परिणामों के लिए इस विधि का उपयोग करते हैं। i.e .: आपके पास 10 दस्तावेज़/प्रति पृष्ठ सूची है और आपको दस्तावेज़ प्राप्त करने की आवश्यकता है। पृष्ठ 6 के लिए। आपका इनपुट ऐसा कुछ हो सकता है: ऑफ़सेट = 60, गिनती = 10 (60 से 70 के दस्तावेज़)।

IndexReader reader = // create IndexReader 
for (int i=offset; i<offset + 10; i++) { 
    if (reader.isDeleted(i)) 
     continue; 

    Document doc = reader.document(i); 
    String docId = doc.get("docId"); 
} 

आप हटाए गए लोगों के साथ कुछ समस्याएं हैं जाएगा क्योंकि आप से शुरू नहीं करना चाहिए ऑफसेट = 60 है, लेकिन से ऑफसेट = 60 + हटाए गए दस्तावेजों से पहले 60

एक वैकल्पिक मैंने पाया दिखाई की संख्या ऐसा कुछ है:

is = getIndexSearcher(); //new IndexSearcher(indexReader) 
    //get all results without any conditions attached. 
    Term term = new Term([[any mandatory field name]], "*"); 
    Query query = new WildcardQuery(term); 

    topCollector = TopScoreDocCollector.create([[int max hits to get]], true); 
    is.search(query, topCollector); 

    TopDocs topDocs = topCollector.topDocs(offset, count); 

नोट: [[]] के बीच टेक्स्ट को अपने मूल्यों के साथ बदलें। 1.5 मिलियन प्रविष्टियों के साथ बड़ी सूचकांक पर इसे चलाएं और एक सेकंड से भी कम समय में यादृच्छिक 10 परिणाम प्राप्त करें। सहमत धीमी है लेकिन कम से कम आप हटाए गए दस्तावेज़ों को अनदेखा कर सकते हैं यदि आपको पेजिनेशन की आवश्यकता है।

4

वहाँ एक प्रश्न वर्ग MatchAllDocsQuery नाम पर है, मुझे लगता है कि इस मामले में इस्तेमाल किया जा सकता:

Query query = new MatchAllDocsQuery(); 
TopDocs topDocs = getIndexSearcher.search(query, RESULT_LIMIT); 
संबंधित मुद्दे