Il motore di ricerca dovrebbe restituire un dizionario o oggetti strongmente tipizzati?

2

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!

    
posta šljaker 22.07.2013 - 19:37
fonte

2 risposte

1

Fondamentalmente, quello che stai chiedendo è: dovrei fare i risultati della ricerca staticamente digitati? Penso che la risposta dipenda da cosa farai con loro e quanto ti piace la tipizzazione statica.

Per quanto riguarda ciò che stai per fare: se hai intenzione di mostrare i risultati all'utente, o qualcosa del genere che tratta tutti i campi nel risultato della ricerca in modo uguale, quindi usa un Dictionary (che è fondamentalmente come la tipizzazione dinamica) ha senso. D'altra parte, se scrivi spesso cose come searchHist.Address (o searchHit["Address"] ), allora questo punta più alla tipizzazione statica.

Riguardo a quanto ti piace la tipizzazione statica: per me, come proponente della tipizzazione statica, l'uso della digitazione dinamica ti offre un piccolo vantaggio a breve termine (ad esempio non devi scrivere quelle dozzine di righe che dichiarano ogni TSearchHit ) per significativi svantaggi a lungo termine (nessun compilatore verifica errori di battitura, nessun IntelliSense). Ciò significa che ritengo che la tipizzazione statica valga quasi sempre il costo iniziale. I sostenitori della digitazione dinamica potrebbero dirti diversamente, ma C # è in gran parte un linguaggio tipizzato staticamente e presumibilmente lo stai usando per un motivo.

    
risposta data 23.07.2013 - 10:02
fonte
1

Non ho familiarità con Lucene.NET / Solr.NET ma mi sembra che una soluzione per questo sarebbe usare tipi generici:

public class SearchResult<TEntity>
{
    public string SearchTerm { get; set; }
    public List<Dictionary<string, TEntity>> SearchHits { get; set; }
    ...
}

interface ISearchService<TEntity>
{
    SearchResult<TEntity> Search(string text);
    void Index<TEntity>(TEntity entity);
    ...
}
    
risposta data 22.07.2013 - 20:23
fonte

Leggi altre domande sui tag