2010-01-21 9 views
6

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

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

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

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

यदि किसी तालिका से या स्ट्रिंग्स की सूची से प्रविष्टियों का एक सेट दिया गया है, तो सी # में एक उलटा इंडेक्स कैसे बना सकता है जो अधिमानतः डेटासेट/डेटाटेबल में सहेजा जाएगा?

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

+0

जेनरिक पर आधारित एक और सी # उलटा इंडेक्स है: http://www.aleandmusic.com/InvertedIndex.aspx –

उत्तर

4

यहाँ एक दृष्टिकोण का एक मोटा अवलोकन है मैंने पहले भी सी # में सफलतापूर्वक उपयोग किया है:

struct WordInfo 
{ 
    public int position; 
    public int fieldID; 
} 

Dictionary<string,List<WordInfo>> invertedIndex=new Dictionary<string,List<WordInfo>>(); 

     public void BuildIndex() 
     { 
      foreach (int fieldID in GetDatabaseFieldIDS()) 
      {  
       string textField=GetDatabaseTextFieldForID(fieldID); 

       string word; 

       int position=0; 

       while(GetNextWord(textField,out word,ref position)==true) 
       { 
        WordInfo wi=new WordInfo(); 

        if (invertedIndex.TryGetValue(word,out wi)==false) 
        { 
         invertedIndex.Add(word,new List<WordInfo>()); 
        } 

        wi.Position=position; 
        wi.fieldID=fieldID; 
        invertedIndex[word].Add(wi); 

       } 

      } 
     } 

नोट्स:

GetNextWord() क्षेत्र के माध्यम से दोहराता है और अगले शब्द और स्थिति रिटर्न । इसे कार्यान्वित करने के लिए string.IndexOf() और चार वर्ण प्रकार जांच विधियों (IsAlpha आदि) का उपयोग करके देखें।

GetDatabaseTextFieldForID() और GetDatabaseFieldIDS() स्वयं व्याख्यात्मक हैं, आवश्यकतानुसार कार्यान्वित करें।

+0

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

+0

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

+0

@ एन्डर, खुशी है कि यह सहायक था। सीरियलाइजेशन डाटाबेस से बचाने/लोड करने का एक विकल्प है। वैकल्पिक रूप से शब्दकोश कुंजी संग्रह के माध्यम से पुनरावृत्त करना और प्रत्येक संबंधित मान प्राप्त करना एक और होगा। – Ash

2

Lucene.net आपकी सर्वश्रेष्ठ शर्त हो सकती है। यह inverted indexes का उपयोग कर परिपक्व पूर्ण पाठ खोज इंजन है।

http://codeclimber.net.nz/archive/2009/09/02/lucene.net-your-first-application.aspx

अद्यतन:

मैं Lucene.net का उपयोग करने में स्मृति संग्रह के खिलाफ अनुक्रमण के लिए एक छोटे से पुस्तकालय लिखा था - यह इस बात के लिए उपयोगी हो सकता है। https://github.com/mcintyre321/Linqdex

+0

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

+0

आश्चर्यजनक रूप से, लुसीन.net के साथ मेरा अनुभव यह है कि यह * लम्बा * लचीला है, जो कि सरल कार्य करना चाहिए। इसके अलावा यह मध्यम ट्रस्ट में सही काम नहीं करता है। इसके अलावा जावा के लिए सच रहने का दर्शन का मतलब है कि कई सुविधाजनक और कलाकार सी #/नेट मुहावरे का उपयोग नहीं किया जाता है। शर्म की बात है क्योंकि यह कई तरीकों से कमाल है। –

1

यदि आप अपने आप को स्पिन करना चाहते हैं, तो Dictionary<T> कक्षा आपके जावा हैशटेबल्स की तरह आपकी आधार होने की संभावना है। जहां तक ​​शब्दकोश में मूल्यों के रूप में संग्रहीत किया जाता है, आपके द्वारा प्रदान की जाने वाली जानकारी के आधार पर बताना मुश्किल होता है, लेकिन आमतौर पर खोज एल्गोरिदम कुछ प्रकार की सेट संरचना का उपयोग करते हैं ताकि आप यूनियनों और चौराहे को चला सकें।LINQ आपको IEnumerable पर उस कार्यक्षमता का अधिकतर लाभ देता है, हालांकि एक विशेष सेट क्लास प्रदर्शन को बढ़ावा दे सकती है।

सेट का ऐसा एक कार्यान्वयन Wintellect PowerCollections में है। मुझे यकीन नहीं है कि क्या यह आपको LINQ पर कोई प्रदर्शन लाभ देगा या नहीं।

DataSet पर सहेजने तक, मुझे यकीन नहीं है कि आप क्या कल्पना कर रहे हैं। मुझे कुछ भी पता नहीं है जो "स्वचालित रूप से" DataSet पर लिखता है। मुझे संदेह है कि आपको इसे स्वयं लिखना होगा, खासकर जब आपने कई अन्य तृतीय-पक्ष विकल्पों के बारे में कई बार उल्लेख किया है जो पर्याप्त लचीला नहीं है।

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