2013-04-03 33 views
6

Lucene.NET'e dayanan bir proje üzerinde çalışıyorum. Bu noktaya kadar, basit ad/değer özelliklerine sahip bir sınıfım vardı (int ID {get; set;} gibi). Ancak, şimdi indeksime yeni bir özellik eklemem gerekiyor. Özellik bir liste türüdür. Bu noktaya kadar, ben Lucene.NET dizelerinin saklanması 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); 
} 

Şimdi MyResult Listesini temsil eden bir özelliği vardır ... şöyle dizinimi güncelledik. Bunu dizinime nasıl koyabilirim? İndeksime eklemem gerekmesinin nedeni, daha sonra geri alabilmem.

Aynı adla yeni bir alan olarak listedeki her değer ekleyebilir
+0

Yalnızca anahtar/değer çiftleri yerine yapılandırılmamış belgeleri saklayan bir şeyi kullanmayı düşündünüz mü? Bu sizin probleminizi çözecektir (bazı örnekler, RavenDB, elasticsearch, MongoDB). Aksi takdirde, dizi bilgilerinin yanı sıra yuvalanmış özellik bilgilerinin yer aldığı anahtar için bir notasyon oluşturmanız gerekir (yeterince kolay, ancak bir PITA ve yukarıda belirtildiği gibi, bunu zaten yapan şeyler vardır). – casperOne

+0

Listeniz neyi içerir? Aranabilir olmalı mı? –

+0

Listenin aranabilir olması gerekmez. –

cevap

7

(lucene olduğunu destekler) ve daha sonra bir dize listesine tekrar bu değerleri okumak:

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); 
} 
İşte

değerleri ayıklamak için nasıl arama sonucu:

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, bunu yapmanın en iyi yolu. Ancak alan, Field.Index.NO ile oluşturulmalıdır, çünkü asker tarafından aranabilir olması gerekmez. –

+0

teşekkürler, cevabımı güncelledim. – Omri