2013-04-03 8 views
6

में स्ट्रिंग्स की सूची संग्रह करना मैं एक ऐसी परियोजना पर काम कर रहा हूं जो Lucene.NET पर निर्भर करता है। इस बिंदु तक, मेरे पास एक कक्षा है जिसमें सरल नाम/मूल्य गुण थे (जैसे int आईडी {get; set;})। हालांकि, अब मुझे अपनी अनुक्रमणिका में एक नई संपत्ति जोड़ने की जरूरत है। संपत्ति सूची का एक प्रकार है। इस बिंदु तक, मैंने अपनी अनुक्रमणिका को इस प्रकार अपडेट किया है ...Lucene.NET

MyResult result = GetResult(); 
using (IndexWriter indexWriter = Initialize()) 
{ 
    var document = new Document(); 
    document.Add(new Field("ID", result.ID.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZE)); 
    indexWriter.AddDocument(document); 
} 

अब, MyResult की एक संपत्ति है जो एक सूची का प्रतिनिधित्व करती है। मैं इसे अपने सूचकांक में कैसे रखूं? मुझे अपनी अनुक्रमणिका में जोड़ने की आवश्यकता है ताकि मैं इसे बाद में वापस प्राप्त कर सकूं।

+0

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

+0

आपकी सूची में क्या शामिल है? क्या इसे खोजने योग्य होना चाहिए? –

+0

सूची को खोजने योग्य नहीं है। –

उत्तर

7

आप एक ही नाम के साथ एक नए क्षेत्र के रूप में सूची में प्रत्येक मूल्य जोड़ सकते हैं (Lucene कि समर्थन करता है) और बाद में एक स्ट्रिंग सूची में वापस उन मूल्यों पढ़ें:

MyResult result = GetResult(); 
using (IndexWriter indexWriter = Initialize()) 
{ 
    var document = new Document(); 
    document.Add(new Field("ID", result.ID.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZE)); 

    foreach (string item in result.MyList) 
    { 
     document.Add(new Field("mylist", item, Field.Store.YES, Field.Index.NO)); 
    } 

    indexWriter.AddDocument(document); 
} 

यहाँ कैसे से मान एक्सट्रैक्ट करने के लिए एक खोज परिणाम:

MyResult result = GetResult(); 
result.MyList = new List<string>(); 

foreach (IFieldable field in doc.GetFields()) 
{ 
    if (field.Name == "ID") 
    { 
     result.ID = int.Parse(field.StringValue); 
    } 
    else if (field.Name == "myList") 
    { 
     result.MyList.Add(field.StringValue); 
    } 
} 
+2

+1, इसे करने का सबसे अच्छा तरीका। लेकिन फ़ील्ड को Field.Index.NO के साथ बनाया जाना चाहिए क्योंकि पूछने वाले ने इसे खोजने योग्य होने की आवश्यकता नहीं है। –

+0

धन्यवाद, मैंने अपना जवाब अपडेट कर लिया है। – Omri

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