2008-10-11 8 views
15

ASP.NET के साथ Lucene.Net का उपयोग करते समय, मैं कल्पना कर सकता हूं कि एक वेब अनुरोध इंडेक्स को अपडेट ट्रिगर कर सकता है जबकि एक अन्य वेब अनुरोध खोज कर रहा है। क्या लुसीन.Net ने समवर्ती पहुंच को प्रबंधित करने की क्षमता बनाई है, या क्या मुझे इसे प्रबंधित करना है, "किसी अन्य प्रक्रिया द्वारा उपयोग किए जाने" त्रुटियों से बचने के लिए?क्या लुसीन.Net एक ही इंडेक्स तक पहुंचने वाले एकाधिक थ्रेड प्रबंधित करता है, एक इंडेक्सिंग जबकि दूसरा खोज रहा है?

संपादित करें: दस्तावेज़ और प्रयोग पढ़ने के बाद, मुझे लगता है कि मैंने सीखा है: दो मुद्दे हैं, थ्रेड सुरक्षा और समरूपता। मल्टीथ्रेडिंग "सुरक्षित" है कि आप इंडेक्स में कुछ भी बुरा नहीं कर सकते हैं। लेकिन, यह एक ही समय में इंडेक्स पर लॉक रखने वाली एक वस्तु की लागत पर सुरक्षित है। दूसरी वस्तु साथ आएगी और एक अपवाद फेंक देगा। इसलिए, आप एक खोज को खुला नहीं छोड़ सकते हैं और किसी अन्य थ्रेड में लेखक को इंडेक्स को अपडेट करने में सक्षम होने की उम्मीद कर सकते हैं। और यदि कोई थ्रेड इंडेक्स को अपडेट करने में व्यस्त है, तो एक खोजकर्ता बनाने की कोशिश विफल हो जाएगी।

इसके अलावा, शोधकर्ता इंडेक्स को देखते हैं क्योंकि यह उस समय था जब वे इसे खोलते थे, इसलिए यदि आप उन्हें चारों ओर रखते हैं, और इंडेक्स अपडेट करते हैं, तो वे अपडेट नहीं देख पाएंगे।

मैं चाहता था कि मेरे खोजकर्ता नवीनतम अपडेट देखें।

मेरा डिज़ाइन, और ऐसा लगता है कि अब तक काम कर रहा है, यह है कि मेरे लेखकों और खोजकर्ता लॉक साझा करते हैं, ताकि वे असफल न हों - वे बस प्रतीक्षा करें - जब तक कि वर्तमान लेखन या खोज न हो जाए।

+0

क्या आप समझा सकते हैं कि आपने ताले कैसे लगाए? क्या आप पढ़ने और लिखने वाले ताले या सिर्फ एक साझा लॉक का उपयोग करते हैं? –

+0

एक साझा लॉक। मैंने लिखा है कि मैंने क्या किया: http://ifdefined.com/blog/post/Full-Text-Search-in-ASPNET-using-LuceneNET.aspx –

+0

आप अपने प्रश्न में जो कहते हैं वह गलत है: "तो, आप कर सकते हैं एक खोज खुला नहीं छोड़ें और किसी अन्य थ्रेड में एक लेखक को इंडेक्स को अपडेट करने में सक्षम होने की उम्मीद करें। और यदि कोई थ्रेड इंडेक्स को अपडेट करने में व्यस्त है, तो एक खोजकर्ता बनाने की कोशिश विफल हो जाएगी। " जैसा कि अन्य उत्तरों में बताया गया है: "एक इंडेक्स लेखक या पाठक ल्यूसीन इंडेक्स फाइलों को संपादित कर सकता है जबकि खोज चल रही है" और इसके विपरीत। –

उत्तर

2

आपको इंडेक्स को समवर्ती लिखने के प्रबंधन के साथ इतना समस्या नहीं है। मेरे पास एसओएलआर के साथ एक आसान रास्ता चल रहा है, जो सर्वर के रूप में चलने के बाद से उन अंतरों में से अधिकांश को दूर करता है।

21
this page के अनुसार

,

अनुक्रमण और खोज केवल धागा सुरक्षित है, लेकिन प्रक्रिया सुरक्षित नहीं हैं।

  • एकाधिक सूचकांक खोजकर्ताओं एक ही समय में Lucene सूचकांक फ़ाइलों को पढ़ सकता: क्या इसका मतलब है कि है।
  • एक सूचकांक लेखक या पाठक Lucene सूचकांक फ़ाइलों को संपादित कर सकते हैं, जबकि खोजें चल रहे
  • एकाधिक सूचकांक लेखक या पाठकों एक ही समय में Lucene सूचकांक फ़ाइलों को संपादित करने की कोशिश कर सकते हैं (यह सूचकांक लेखक के लिए महत्वपूर्ण है/पाठक बंद होने के लिए यह फ़ाइल लॉक जारी करेगा)। हालांकि, क्वेरी पार्सर थ्रेड सुरक्षित नहीं है, इसलिए इंडेक्स का उपयोग करते हुए प्रत्येक थ्रेड का अपना क्वेरी पार्सर होना चाहिए। ताकि आप सूचकांक अद्यतन कर सकते हैं, जबकि लोगों को यह खोज कर रहे हैं

सूचकांक लेखक तथापि, धागा सुरक्षित है। हालांकि, आपको सुनिश्चित करना होगा कि खुले इंडेक्स खोजकर्ताओं के साथ थ्रेड उन्हें बंद कर दें और नए अपडेट किए गए डेटा प्राप्त करने के लिए नए वाले लोगों को खोलें।

+0

प्रत्येक क्वेरी पर इंडेक्स खोलने का ओवरहेड क्या है? –

+1

हमारे पास काफी बड़ी (बहु-गीगाबाइट) खोज अनुक्रमणिका है, और प्रत्येक क्वेरी पर एक इंडेक्स खोलने की लागत नगण्य है। –

+1

यह ध्यान दिया जाना चाहिए कि यह आलेख जावा के लिए मूल लुसीन के बारे में है। .NET कार्यान्वयन का कोई उल्लेख नहीं है, न ही वर्णित व्यवहार ल्यूसीन "मानक" की एक विशेषता है (और इस प्रकार लुसीन.Net में पुन: कार्यान्वित किया जाएगा) या यदि यह कार्यान्वयन-विशिष्ट व्यवहार है। –

3

आप मुद्दों हो सकता है, यदि आपका अनुक्रमण धागा जो कुछ सूचकांक क्षेत्रों के विलय में परिणाम है एक नया दस्तावेज़ पैदा कर रही है, तो मर्ज किए गए क्षेत्रों से हट जाएगा और नया खंड बनाया जाएगा।समस्या यह है कि आपके इंडेक्स खोजकर्ता ने खोले जाने पर सभी सेगमेंट को लोड किया था, ऐसे में उन खंडों में "पॉइंटर्स" हैं जो खोले जाने पर मौजूद थे। अब अगर इंडेक्स लेखक एक सेगमेंट विलय करता है और सेगमेंट हटा देता है, तो आपके इंडेक्स सर्चर को अभी भी लगता है कि सेगमेंट फाइल मौजूद है और "फाइल नहीं मिली त्रुटि" के साथ असफल हो जाएगी। आपको वास्तव में क्या करना है, एसओएलआर का उपयोग करके या अपने स्वयं के इंडेक्स स्नैपशॉट प्रतिकृति को एसओएलआर के समान करते हुए, अपनी खोज योग्य इंडेक्स से अपनी लिखने योग्य इंडेक्स को अलग करें। मैंने कुशल स्नैपशॉट प्रतिकृति बनाने के लिए एनटीएफएस हार्ड-लिंक का उपयोग करते हुए, विंडोज़ पर .NET और Lucene.NET का उपयोग करके एसओएलआर को बहुत समान प्रणाली बनाई है। यदि आप रुचि रखते हैं तो मैं आपको अधिक जानकारी दे सकता हूं।

+0

हाय बॉब हैं, मैं एएसपीनेट एमवीसी के साथ सोलरनेट का उपयोग कर रहा हूं। खोजों के दौरान नई वस्तुओं को जोड़ने की कोशिश करते समय मुझे इंडेक्स दूषित होने के साथ वास्तविक समस्याओं का अनुभव करना शुरू हो रहा है। आभारी होंगे यदि आप सर्वोत्तम अभ्यास में कोई अंतर्दृष्टि प्रदान कर सकते हैं। – Jordan