2013-04-03 20 views
6

Pracuję nad projektem opartym na Lucene.NET. Do tej pory posiadałem klasę, która miała proste właściwości nazwa/wartość (np. Int ID {get; set;}). Jednak teraz muszę dodać nową właściwość do mojego indeksu. Właściwość jest typem listy. Do tego momentu zaktualizowałem indeks tak, aby ...Przechowywanie listy ciągów znaków w 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); 
} 

Teraz MyResult ma właściwość reprezentującą listę. Jak umieścić to w moim indeksie? Powodem, dla którego muszę go dodać do mojego indeksu, jest to, że mogę go później odzyskać.

+0

Czy zastanawiałeś się nad użyciem czegoś, co przechowuje niepotrzebne dokumenty zamiast zwykłych par klucz-wartość? To rozwiązałoby twój problem (niektóre przykłady, RavenDB, elasticsearch, MongoDB). W przeciwnym razie musiałbyś wygenerować notację dla klucza, który zawiera informacje o tablicy, a także zagnieżdżone informacje o właściwościach (dość łatwe, ale PITA i jak wspomniano powyżej, są rzeczy, które już to robią). – casperOne

+0

Co zawiera twoja lista? Czy musi być możliwe wyszukiwanie? –

+0

Lista NIE musi być dostępna do wyszukiwania. –

Odpowiedz

7

Możesz dodać każdą wartość w liście jako nowego pola o tej samej nazwie (Lucene obsługuje tego), a później odczytać te wartości z powrotem do listy strun:

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); 
} 

Oto sposób wyodrębnić wartości z wynik wyszukiwania:

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, najlepszy sposób na zrobienie tego. Ale pole powinno zostać utworzone za pomocą Field.Index.NO, ponieważ pytający określił, że nie trzeba go przeszukiwać. –

+0

dzięki, zaktualizowałem swoją odpowiedź. – Omri

Powiązane problemy