लुसीने इंडेक्स डॉक्यूमेंट कैसे करता है?


95

मैंने ल्यूसीन के बारे में कुछ दस्तावेज़ पढ़े; मैं भी इस लिंक ( http://lucene.sourceforge.net/talks/pisa ) में दस्तावेज़ पढ़ता हूं ।

मैं वास्तव में नहीं समझता कि कैसे ल्यूसीन दस्तावेज़ों को अनुक्रमित करता है और यह नहीं समझ पाता है कि ल्यूसिन किन एल्गोरिदम को अनुक्रमण के लिए उपयोग करता है?

उपरोक्त लिंक पर, यह कहता है कि ल्यूसीन इस एल्गोरिथ्म को अनुक्रमण के लिए उपयोग करता है:

  • वृद्धिशील एल्गोरिथ्म:
    • खंड सूचकांकों का एक ढेर बनाए रखें
    • प्रत्येक आने वाले दस्तावेज़ के लिए सूचकांक बनाएं
    • स्टैक पर नए इंडेक्स को पुश करें
    • चलो बी = 10 मर्ज कारक हो; एम = 8

for (size = 1; size < M; size *= b) {
    if (there are b indexes with size docs on top of the stack) {
        pop them off the stack;
        merge them into a single index;
        push the merged index onto the stack;
    } else {
        break;
    }
}

यह एल्गोरिथम अनुकूलित अनुक्रमण कैसे प्रदान करता है?

क्या ल्यूसीन बी-ट्री एल्गोरिदम या किसी अन्य एल्गोरिथ्म को अनुक्रमण के लिए उपयोग करता है - या क्या इसका कोई विशेष एल्गोरिथ्म है?


यहां अधिकांश उत्तर सही हैं कि पहले ल्यूसिन उल्टे सूचकांक बनाता है , लेकिन यह महत्वपूर्ण बिंदु नहीं बताता है कि उस शब्द सूचकांक को बाद में कैसे खोजा जाता है (और, मुझे विश्वास है, ओपी वास्तव में क्या मांग करता है)। तो नीचे कृपया इस पुराने प्रश्न का एक नया उत्तर पाएं जो उम्मीद करता है कि बेहतर अंतर्दृष्टि प्रदान करेगा।
fnl

1
मेरे उत्तर को एक बार फिर अपडेट करें, क्योंकि वर्तमान उत्तर (मेरा सहित!) ओपी के मुख्य दो सवालों के जवाब देने के लिए वास्तव में संतोषजनक नहीं हैं (ल्यूसिन अनुकूलित अनुक्रमण कैसे प्रदान करता है और किस विशेष एल्गोरिथ्म द्वारा - एक स्किप-लिस्ट, बी-ट्री नहीं, BTW)। आशा है कि मेरे अंतिम अपडेट अब वास्तविक प्रश्न का ठीक से उत्तर देंगे!
fnl

जवाबों:


54

यहाँ एक अच्छा लेख है: https://web.archive.org/web/20130904073403/http://www.ibm.com/developerworks/library/wa-lucene/

संपादित करें 12/2014: मूल रूप से हटाए जाने के कारण संग्रहीत संस्करण में अपडेट किया गया, संभवतः सबसे अच्छा हालिया विकल्प http://lucene.apache.org/core/3_6_2/fileformats.html है

Http://lucene.apache.org/core/4_10_2/core/org/apache/lucene/codecs/lucene410/package-summary.html#package-description पर और भी हाल का संस्करण है , लेकिन इसमें इसकी जानकारी कम है पुराने की तुलना में।

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

शब्द एक विश्लेषक के उपयोग से उत्पन्न होते हैं जो प्रत्येक शब्द को उसके मूल रूप में उपजा है। अंग्रेजी भाषा के लिए सबसे लोकप्रिय उपमा एल्गोरिथ्म पोर्टर है stemming एल्गोरिथ्म: http://tartarus.org/~martin/PorterStmermer/

जब कोई क्वेरी जारी की जाती है तो इसे उसी विश्लेषक के माध्यम से संसाधित किया जाता है जिसका उपयोग सूचकांक बनाने के लिए किया गया था और फिर सूचकांक में मिलान शब्द को देखने के लिए उपयोग किया गया था। यह क्वेरी से मेल खाने वाले दस्तावेज़ों की एक सूची प्रदान करता है।


आपके उत्तर और लिंक के लिए धन्यवाद। लेकिन मैंने सुना है कि ल्यूसीन परियोजना में "स्नोबॉल" नाम का एक विशेष स्टेम है? क्या आपने उसके बारे में कुछ सुना है?
एम। अरोलाही

यह एक अलग प्रश्न है: देखें lucidimagination.com/search/… इसके अलावा, आपके प्रश्न के पैटर्न को देखकर, मेरा सुझाव है कि आप 'ल्यूसीन इन एक्शन' पुस्तक पढ़ें: manning.com/hatcher2 (पहला संस्करण थोड़ा दिनांकित है, लेकिन हो सकता है एक मृत पेड़ संस्करण में पाया गया। दूसरा संस्करण ई-बुक के रूप में खरीदा जा सकता है)।
युवल एफ

5
क्या आप उत्तर को संशोधित कर सकते हैं, पहला लिंक जो एक IBM लिंक है वह नहीं मिला :)
Adelin

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

44

संक्षेप में, Lucene डिस्क पर Skip-Lists का उपयोग करके एक उलटा सूचकांक बनाता है , और फिर एक परिमित स्टेट ट्रांसड्यूसर (FST) का उपयोग करके अनुक्रमित शब्दों के लिए एक मैपिंग को मेमोरी में लोड करता है । ध्यान दें, हालांकि, ल्यूसिन (आवश्यक रूप से) सभी अनुक्रमित शब्दों को रैम पर लोड नहीं करता है , जैसा कि स्वयं ल्यूसिन की अनुक्रमण प्रणाली के लेखक माइकल मैककंडलेस द्वारा वर्णित है। ध्यान दें कि छोड़ें-सूचियाँ का उपयोग करके, सूचकांक दूसरे करने के लिए एक हिट से चल जा सकता है, जैसी चीजों बनाने सेट और, विशेष रूप से, सीमा प्रश्नों संभव (ज्यादा बी पेड़ की तरह)। और स्किप-लिस्ट को इंडेक्स करने की विकिपीडिया प्रविष्टि यह भी बताती है कि ल्यूसीन की स्किप-लिस्ट कार्यान्वयन को बहु-स्तरीय क्यों कहा जाता हैस्किप-लिस्ट - अनिवार्य रूप से, O(log n)लुक-अप को संभव बनाने के लिए (फिर से, बी-पेड़ों की तरह)।

इसलिए एक बार उलटा (टर्म) इंडेक्स - जो एक स्किप-लिस्ट डेटा संरचना पर आधारित है - दस्तावेजों से बनाया गया है, इंडेक्स डिस्क पर संग्रहीत होता है। Lucene तो लोड करता है (जैसा कि पहले ही कहा गया है: संभवतः, केवल कुछ) उन शर्तों को एक परिमित राज्य ट्रांसड्यूसर में , एफएसटी कार्यान्वयन में मॉर्फोलॉग द्वारा शिथिल रूप से प्रेरित किया गया है

माइकल मैककंडलेस (भी) यह समझाने के लिए कि कैसे और क्यों ल्यूसिन एक (न्यूनतम एसाइक्लिक) एफएसटी का उपयोग करता है , यह स्पष्ट करने के लिए बहुत अच्छा और कठिन काम करता है कि ल्यूसिन स्टोर को अनिवार्य रूप से एक के रूप में SortedMap<ByteSequence,SomeOutput>, और एफएसटी काम करने के लिए एक मूल विचार देता है (यानी, एफएसटी बाइट अनुक्रमों को अनुक्रमित करता है [अर्थात, अनुक्रमित शब्द] इस मानचित्रण की स्मृति का उपयोग उप-रैखिक बढ़ने के लिए करें)। और वह उस कागज की ओर इशारा करता है जो विशेष FST एल्गोरिथ्म Lucene उपयोगों का भी वर्णन करता है।

उन उत्सुक लोगों के लिए क्यों ल्यूसिन स्किप-लिस्ट का उपयोग करता है, जबकि अधिकांश डेटाबेस (बी +) - और / या (बी)-ट्री का उपयोग करते हैं, इस प्रश्न के बारे में सही एसओ उत्तर पर एक नज़र डालें (स्किप-लिस्ट बनाम बी-ट्रीज़)। यह उत्तर एक बहुत अच्छा, गहन विवरण देता है - अनिवार्य रूप से, इतना अधिक नहीं कि सूचकांक के समवर्ती अपडेट "अधिक अमननीय" हो जाएं (क्योंकि आप तुरंत बी-ट्री को फिर से संतुलित नहीं करने का फैसला कर सकते हैं, जिससे एक ही समवर्ती प्रदर्शन के बारे में प्राप्त होता है स्किप-लिस्ट), बल्कि, स्किप-लिस्ट्स आपको (विलंबित या नहीं) संतुलन संचालन पर काम करने से बचाते हैं (अंततः) बी-ट्रीज़ द्वारा आवश्यक (वास्तव में, जैसा कि उत्तर दिखाता है / संदर्भ है, शायद बी-ट्रीज़ और [बहु-स्तरीय] स्किप-लिस्ट के बीच बहुत कम प्रदर्शन अंतर है, यदि या तो "सही किया गया है।"


1
Afaik वे डिस्क ट्री की संख्या को कम करने के लिए B- ट्री के बजाय Skip लिस्ट का उपयोग कर रहे हैं, क्योंकि स्किप लिस्ट का हिस्सा मेमोरी में रहता है और बहुत कम डिस्क IO के लिए जब अनुक्रमणिका सूचकांक की आवश्यकता होती है
एंटोन

24

ऐसा लगता है कि इंडेक्स मर्जिंग के बारे में आपका सवाल इंडेक्सिंग से ज्यादा है।

यदि आप निम्न-स्तरीय विवरणों को अनदेखा करते हैं, तो अनुक्रमण प्रक्रिया काफी सरल है। दस्तावेजों से "इनवर्टेड इंडेक्स" कहा जाता है। इसलिए यदि पाठ "टू बी ऑर नॉट टू बी" और आईडी = 1 के साथ डॉक्यूमेंट आता है, तो उल्टे इंडेक्स जैसा दिखेगा:

[to] → 1
[be] → 1
[or] → 1
[not] → 1

यह मूल रूप से यह है - शब्द से दिए गए दस्तावेजों की सूची में शब्द से सूचकांक । इस सूचकांक (शब्द) की प्रत्येक पंक्ति को पोस्टिंग सूची कहा जाता है। यह सूचकांक लंबे समय तक भंडारण पर बना रहता है।

वास्तव में चीजें और अधिक जटिल हैं:

  • दिए गए विशेष विश्लेषक के आधार पर ल्यूसीन कुछ शब्दों को छोड़ सकता है;
  • भाषा के लचीलेपन को कम करने के लिए शब्दों को पूर्वनिर्धारित एल्गोरिथ्म का उपयोग करके प्रीप्रोसेस किया जा सकता है;
  • पोस्टिंग सूची में न केवल दस्तावेजों के पहचानकर्ता हो सकते हैं, बल्कि दस्तावेज़ के अंदर दिए गए शब्द (संभावित कई उदाहरण) और कुछ अन्य अतिरिक्त जानकारी की भरपाई भी हो सकती है।

कई और जटिलताएं हैं जो बुनियादी समझ के लिए इतनी महत्वपूर्ण नहीं हैं।

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

तो सवाल उठता है - हम पहले से ही अनुक्रमित दस्तावेज़ को कैसे बदल सकते हैं ?

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

यह वह जगह है जहां विलय होता है। विलय - समग्र रूप से अधिक कुशल सूचकांक बनाने के लिए कई सूचकांक के संयोजन की प्रक्रिया है। मर्ज के दौरान मूल रूप से क्या होता है, लाइव दस्तावेजों को नए खंड और पूरी तरह से हटाए गए पुराने खंडों पर कॉपी किया जाता है।

इस सरल प्रक्रिया का उपयोग करके ल्यूसीन खोज प्रदर्शन के मामले में सूचकांक को अच्छे आकार में बनाए रखने में सक्षम है।

आशा है कि यह मदद करेगा।


1
तो सबसे पहले सबसे अद्यतित परिणाम खोजने के लिए, क्या सबसे नए सेगमेंट को देखकर कोई खोज शुरू होगी? तो बस स्पष्ट करने के लिए - मान लीजिए कि एक दस्तावेज़ अपडेट किया गया है। दस्तावेज़ के पुराने संस्करण को हत्या की सूची में जोड़ा जाता है, फिर पुराने खंडों में पाए जाने वाले किसी भी मैच को खोज परिणामों से हटा दिया जाता है यदि उनका दस्तावेज़ आईडी हत्या सूची में एक आईडी से मेल खाता है?
जोएल बी

2
हाँ आप सही हैं। उल्लेख करने के लिए केवल एक चीज है अंतिम क्रम को छँटाई नियमों (तुच्छ मामले में प्रासंगिकता सूचकांक) का उपयोग करके परिभाषित किया गया है, इस प्रकार जिस क्रम में खंडों की खोज की गई है वह प्रासंगिक नहीं है।
डेनिस बज़्हेनोव

12

यह उलटा सूचकांक है , लेकिन यह निर्दिष्ट नहीं करता है कि यह किस संरचना का उपयोग करता है। ल्यूसीन में सूचकांक प्रारूप की पूरी जानकारी है।
'फ़ाइल एक्सटेंशन का सारांश' से शुरू करें।

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


1
ल्यूसिन का उलटा सूचकांक एक स्किप-लिस्ट पर आधारित है, न कि बी-ट्री। अभी भी बहुत व्यापक अर्थों में एक पेड़ जैसी संरचना है, लेकिन बस पूरा होने के लिए - जैसे, इस SO प्रश्न को फिर से देखें। ल्यूसिन एक स्किप-लिस्ट का उपयोग और यह एसओ का सवाल है कि बी-पेड़ों पर स्किप-लिस्ट बेहतर क्यों हो सकती है
fnl
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.