2013-04-03 13 views
6

Sto lavorando a un progetto che si basa su Lucene.NET. Fino a questo punto, ho avuto una classe che aveva semplici proprietà nome/valore (come int ID {get; set;}). Tuttavia, ora ho bisogno di aggiungere una nuova proprietà al mio indice. La proprietà è un tipo di elenco. Fino a questo punto, ho aggiornato il mio indice in questo modo ...Memorizzazione dell'elenco di stringhe in 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); 
} 

Ora, MyResult ha una proprietà che rappresenta una lista. Come lo inserisco nel mio indice? Il motivo per cui ho bisogno di aggiungerlo al mio indice è che posso rimuoverlo più tardi.

+0

Hai mai considerato l'utilizzo di qualcosa che memorizza schemi, documenti non strutturati anziché solo coppie chiave-valore? Questo risolverebbe il tuo problema (alcuni esempi, RavenDB, elasticsearch, MongoDB). In caso contrario, è necessario generare una notazione per la chiave che contiene le informazioni dell'array e le informazioni di proprietà annidate (abbastanza facile, ma una PITA e come indicato sopra, ci sono cose che lo fanno già). – casperOne

+0

Cosa contiene la tua lista? Ha bisogno di essere ricercabile? –

+0

L'elenco NON deve essere ricercabile. –

risposta

7

È possibile aggiungere ogni valore nella lista come un nuovo campo con lo stesso nome (Lucene supporta questo) e poi leggere quei valori di nuovo in una lista di stringhe:

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

Ecco come estrarre i valori da un risultato della ricerca:

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, il modo migliore per farlo. Ma il campo dovrebbe essere creato con Field.Index.NO poiché il richiedente specificata non ha bisogno di essere ricercabile. –

+0

grazie, ho aggiornato la mia risposta. – Omri