Sto costruendo un motore di ricerca usando Lucene.NET / Solr.NET e mi chiedo se i risultati di ricerca debbano essere restituiti come un dizionario o un oggetto strongmente tipizzato.
public class SearchResult
{
public string SearchTerm { get; set; }
public List<Dictionary<string, object>> SearchHits { get; set; }
...
}
// where search hit looks like this
Dictionary<string, object> searchHit = new Dictionary<string, object>
{
{ "Name", "John Doe" },
{ "Address", "Some street" },
};
vs
public class SearchResult
{
public string SearchTerm { get; set; }
public List<Foo> SearchHits { get; set; }
...
}
// where search hit looks like this
var searchHit = new SearchHit
{
Name = "John Doe",
Address = "Some address"
};
Indicherò diversi tipi di oggetti (persone, pagine Web, file, ecc.).
Ogni oggetto ha un diverso insieme di proprietà (le persone hanno nome e indirizzo, mentre le pagine web hanno URL e titoli) e gli hit di ricerca non hanno lo stesso set di proprietà degli oggetti originali ( WebPage
class ha la proprietà MainContent
, ma dopo l'indicizzazione, il risultato della ricerca che rappresenta questo oggetto avrà la proprietà PreviewText
(i primi 300 caratteri della proprietà MainContent
con i tag HTML rimossi).
Non voglio duplicare il codice dappertutto e avere: IPeopleSearchService
, IWebPagesSearchService
, IFilesSearchService
, ecc. e risultati di ricerca corrispondenti: PeopleSearchResult
, FileSearchResult
, ecc.
interface IFooService
{
FooSearchResult Search(string text);
void Index(Foo foo);
...
}
interface IBarService
{
BarSearchResult Search(string text);
void Index(Bar bar);
...
}
...
Mi piacerebbe avere una soluzione più generica, ma non mi piace la complessità eccessiva. Dovrebbe essere leggibile e facilmente comprensibile da uno sviluppatore junior.
interface ISearchService<TEntity, TSearchHit>
{
SearchResult<TSearchHit> Search(string text);
void Index(TEntity entity);
}
Come progetteresti un sistema del genere? Qualsiasi aiuto sarebbe molto apprezzato!