2009-08-16 8 views
5

मेरे पास दो अलग-अलग इंडेक्स हैं जो अलग-अलग फ़ील्ड रखते हैं जिसमें एक साथ इंडेक्स के लिए सभी खोजे जाने योग्य फ़ील्ड होते हैं। उदाहरण के लिए पहली अनुक्रमणिका में सभी दस्तावेजों के लिए अनुक्रमित पाठ होता है, और दूसरे में प्रत्येक दस्तावेज़ के लिए टैग होते हैं।मैचों को दो अलग-अलग (शर्मीली नहीं) से कैसे विलय करें ल्यूसीन इंडेक्स

ध्यान दें कि नीचे दिया गया उदाहरण थोड़ा सा गड़बड़ है क्योंकि मैंने संस्थाओं के नाम बदल दिए हैं। Index1: पाठ दस्तावेज़ आईडी

Index2: टैग नाम: "बहुत महत्वपूर्ण" उपयोगकर्ता : "फ्रेड की आईडी"

मैं अनुक्रमित अलग रखने के लिए के रूप में यह बेकार लगता है लगातार अद्यतन चाहते हैं जब भी कोई उपयोगकर्ता टैग जोड़ता/निकालता है तो एक एकल अनुक्रमणिका।

अब तक मुझे लगता है कि मुझे दो खोज परिणामों को संसाधित करने और उन्हें मैन्युअल रूप से (कोड में) मर्ज करने की आवश्यकता हो सकती है। कोई अन्य सुझाव?

मैं अलग/sharded अनुक्रमणिका मर्ज करने के लिए नहीं करना चाहती।

+0

क्या आपके पास इंडेक्स में संग्रहीत टैग की आवश्यकता है? इस जानकारी को एक रिलेशनल डेटाबेस (जैसे MySQL या SQL सर्वर) में क्यों स्टोर न करें, और इंडेक्स में अद्वितीय आईडी स्टोर करें? – jeremyalan

+0

@Phoenix - क्योंकि मैं एक क्वेरी निष्पादित करने में सक्षम होना चाहता हूं जो दोनों इंडेक्स को फैलाता है। –

उत्तर

4

इस व्यवस्था का समर्थन करने के लिए लुसेन के पास IndexReader का एक प्रकार है — ParallelReader

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

इस दृष्टिकोण को आम तौर पर "लंबवत विभाजन" कहा जाता है, "क्षैतिज विभाजन" या शेरिंग के विपरीत।

+0

यह उम्मीद है कि दस्तावेज आईडी दोनों मामलों में मेल खाते हैं। मैं इसे ठीक से प्रबंधित करना चाहता हूं। –

+0

यह सिर्फ एक आशा से अधिक है कि दस्तावेज आईडी मेल खाते हैं क्योंकि दस्तावेजों को इंडेक्स में जोड़ा जाता है; आईडी बस अनुक्रम संख्या हैं। मुझे यह स्पष्ट नहीं है कि क्या ल्यूसीन एक ऐसे इंडेक्स को "कॉम्पैक्ट" करने के लिए दस्तावेज़ आईडी को फिर से सौंपेगा जिसमें हटाए गए रिकॉर्ड का उच्च अनुपात है (याद रखना कि ल्यूसीन में "अपडेट" मूल रिकॉर्ड का एक डिलीट है जिसके बाद "अपडेट" "रिकॉर्ड)। – erickson

+0

"अनुक्रम संख्या" "दस्तावेज़ आईडी" की तुलना में वास्तविक परिभाषा के करीब है, लेकिन वे वास्तव में केवल "ऑफ़सेट" हैं। चूंकि एक इंडेक्स को अनुकूलित किया जाता है, और हटाए गए दस्तावेजों को मूल रूप से अंतर्निहित इंडेक्स फ़ाइलों (इंडेक्स को डी-फ्रैगमेंट करने की तरह) से हटा दिया जाता है, इन ऑफसेट्स बदल जाएंगे, और इसका पता लगाने के लिए कोई आसान (आसान) तरीका नहीं है। इस समस्या का सबसे आम समाधान जो मैंने पार किया है वह है कि आप अपनी ल्यूसीन दस्तावेज़ में "आईडी" फ़ील्ड में अपनी अनूठी आईडी स्टोर करें। – jeremyalan

0

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

score(k) = a*tagscore(k)+b*fulltextscore(k)

कहाँ ए और बी अनुभव निर्धारित गुणांक हो जाएगा।

अधिक विस्तृत चर्चा के लिए, ग्रांट इंगर्सोल के findability और debugging relevance issues in search पेपर देखें।

+0

स्कोरिंग कोई मुद्दा नहीं है क्योंकि विलय बूलियन क्वेरी सीमाओं पर होगा। असली सवाल खोज के तरीके के संदर्भ में बनी हुई है। –

+0

@ एमपी: कृपया स्पष्ट करें। यदि आप दोनों इंडेक्स में प्रति दस्तावेज़ एक अद्वितीय आईडी स्टोर करते हैं, तो मुझे खोज में कोई समस्या नहीं दिखाई देती है। मुझे रैंकिंग/स्कोरिंग समस्या दिखाई देती है - यदि आपको दस्तावेज़ टेक्स्ट से 1000 हिट और टैग से 2000 हिट मिलती हैं, तो आप शायद शीर्ष 20 या तो प्रदर्शित करना चाहेंगे; यह वह जगह है जहां स्कोरिंग मायने रखती है। –

0

इस दृष्टिकोण के साथ मुख्य समस्या दस्तावेजों की रैंकिंग के साथ करना है क्योंकि डिफ़ॉल्ट एल्गोरिदम (और शायद कुछ अपवादों के साथ सबसे कस्टम एल्गोरिदम) शब्द आवृत्ति और व्यस्त दस्तावेज़ आवृत्ति पर आधारित होते हैं।

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

इस समस्या का सामान्य समाधान दो चरणबद्ध दृष्टिकोण है। सबसे पहले, यह निर्धारित करने के लिए प्रत्येक सूचकांक के विरुद्ध क्वेरी चलती है कि प्रत्येक शब्द में कितने दस्तावेज़ होते हैं।इसके बाद, परिणाम एकत्रित किए जाते हैं और क्वेरी फिर से चलती है, लेकिन इस बार इसके साथ व्यस्त दस्तावेज़ आवृत्ति भेज दी जाती है।

जैसा कि आप कल्पना कर सकते हैं, यह एक ही इंडेक्स के खिलाफ एक क्वेरी चलाने के साथ-साथ कुछ भी नहीं चल रहा है, लेकिन मुझे लगता है कि कई इंडेक्स में दस्तावेज़ों को संग्रहीत करने के लिए व्यापार बंद है।

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