2014-09-17 3 views
7

अपडेट करने के बाद दस्तावेज़ नहीं ढूंढ सकते हैं ऐसा लगता है कि जब भी मैं इंडेक्स में मौजूदा दस्तावेज़ अपडेट करता हूं (डिलीट/एड के लिए समान व्यवहार), तो यह टर्मक्वायर के साथ नहीं मिल सकता है। यहां एक छोटा स्निपेट है:ल्यूसीन

iw = new IndexWriter (निर्देशिका, कॉन्फ़िगरेशन);

Document doc = new Document(); 
doc.add(new StringField("string", "a", Store.YES)); 
doc.add(new IntField("int", 1, Store.YES)); 

iw.addDocument(doc); 

Query query = new TermQuery(new Term("string","a")); 

Document[] hits = search(query); 
doc = hits[0]; 
print(doc); 

doc.removeField("int"); 
doc.add(new IntField("int", 2, Store.YES)); 

iw.updateDocument(new Term("string","a"), doc); 

hits = search(query); 
System.out.println(hits.length); 
System.out.println("_________________"); 

for(Document hit : search(new MatchAllDocsQuery())){ 
    print(hit); 
} 

यह निम्न सांत्वना उत्पादन का उत्पादन:

stored,indexed,tokenized,omitNorms,indexOptions=DOCS_ONLY<string:a> 
stored<int:1> 
________________ 
0 
_________________ 
stored,indexed,tokenized,omitNorms,indexOptions=DOCS_ONLY<string:a> 
stored<int:2> 
________________ 

ऐसा लगता है कि अद्यतन के बाद, सूचकांक में दस्तावेज़ (बजाय नया दस्तावेज़) और MatchAllDocsQuery द्वारा दिया जाता है, लेकिन नहीं कर सकते एक TermQuery द्वारा पाया जा सकता है।

पूर्ण नमूना कोड http://pastebin.com/sP2Vav9v

इसके अलावा में उपलब्ध, यह केवल तब होता है (दूसरा काम नहीं कर रहा खोज) जब StringField मूल्य विशेष वर्ण हैं (उदाहरण के लिए फ़ाइल:/एफ: /)।

+1

क्या आप 'iw.commit()' नहीं खो रहे हैं? – mindas

+0

कुछ भी नहीं बदलता है। इसे अजीब कोशिश की। साथ ही, खोज प्रत्येक बार लेखक से एक नया पाठक खुलती है: DirectoryReader reader = DirectoryReader.open (iw, true); – Michael

+0

मुझे एक समान समस्या का सामना करना पड़ रहा है। लुसीन का कौन सा संस्करण यह है? – carlspring

उत्तर

4

आपके द्वारा पेस्टबिन में संदर्भित कोड को कुछ भी नहीं मिला है क्योंकि आपका StringField कुछ भी नहीं है लेकिन एक स्टॉपवर्ड (a) है। a को किसी ऐसे स्टॉपवर्ड के साथ प्रतिस्थापित करना (उदा। ax) दोनों खोजों को 1 दस्तावेज़ वापस करने के लिए बनाता है।

तुम भी सही परिणाम प्राप्त अगर तुम खाली stopword सेट (CharArraySet.EMPTY_SET) अभी तक अभी भी StringField के लिए a उपयोग करने के साथ StandardAnalyzer के निर्माण के लिए होने पर होता। यह file:/F:/ के लिए काम नहीं करेगा हालांकि।

हालांकि, सबसे अच्छा समाधान यह है कि StandardAnalyzer को KeywordAnalyzer के साथ प्रतिस्थापित करना होगा।

+0

मैंने सोचा कि स्ट्रिंगफ़ील्ड का विश्लेषण नहीं किया जा रहा है? साथ ही, अपडेटिंग कैसे आती है इस प्रभाव में है, लेकिन एक नया दस्तावेज़ डालना नहीं है? – Michael

+0

'स्ट्रिंगफ़िल्ल्ड' का विश्लेषण नहीं किया गया है, यह सही है। लेकिन स्टॉपवर्ड फ़िल्टर अभी भी लागू है - 'मानक विश्लेषक' जावाडोक देखें। ल्यूसीन इन एक्शन बुक (पृष्ठ 120-121) कहता है: "मानक विश्लेषक 'में स्टॉपवर्ड हटाने को भी शामिल किया गया है"। प्रश्न को अद्यतन/सम्मिलित करने के संबंध में - मुझे पूरी तरह से यकीन नहीं है। अगर मुझे कोई मिल जाए तो मैं डीबग करने और परिणामों को पोस्ट करने का प्रयास करूंगा। – mindas

1

मैं सभी इंडेक्सिंग ऑपरेशंस के बाद अपनी कार्यशील निर्देशिका को दोबारा शुरू करके इसे से छुटकारा पा सकता हूं: उदाहरण के लिए "path_dir" नामक इस इंडेक्सिंग ऑपरेशंस के लिए एक नई निर्देशिका बनाएं। यदि आपने अपडेट किया है तो निम्न परिचालनों को कॉल करें और अपने सभी पिछले कार्यों को दोबारा करें।

StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_46); 
FSDirectory dir; 
try { 
    // delete indexing files : 
    dir = FSDirectory.open(new File(path_dir)); 
    IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_46, analyzer); 
    IndexWriter writer = new IndexWriter(dir, config); 
    writer.deleteAll(); 
    writer.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

हालांकि, ध्यान दें कि यदि आप बड़े डेटा को संभालने में हैं तो इस तरह से बहुत धीमा हो जाएगा।

+0

यह वास्तव में "ठीक" कैसे है? सूचकांक हटाना बिल्कुल हास्यास्पद है! क्या होता है यदि आपको 10 000 000 रिकॉर्ड पांच बार अपडेट करने की आवश्यकता है और आपको हर बार इंडेक्स को हटाना होगा ?! यह स्वीकार्य नहीं है। – carlspring

+0

मैंने पहले ही अपने उत्तर के अंत में बड़े डेटा के बारे में टिप्पणी की है। मैं अपना कोड इस तरह से ठीक काम कर सकता हूं। चूंकि मैं बड़ा डेटा नहीं संभाला रहा हूं, यह मेरे लिए कोई समस्या नहीं थी। अगर माइकल के पास भी छोटा डेटा है तो यह काम कर सकता है। – balik

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