Domanda

Ho un'applicazione in cui ho bisogno di cercare in vari campi basati sul testo. L'applicazione viene sviluppata utilizzando NHibernate come ORM.

Vorrei implementare Porter che si tratta nelle ricerche, per poter restituire risultati pertinenti anche quando la parola chiave corrisponde a una parola simile, ad esempio la descrizione di un prodotto contiene memories Mentre la parola chiave di ricerca è memory.

Qualcuno può suggerire le migliori pratiche per tali tipi di ricerche? La prima idea che mi viene in mente è archiviare due versione dello stesso campo nel database, ad esempio:

Description
Description_Search

Il Description La colonna sarebbe il testo inserito dall'amministratore del sito Web ed è il testo visibile sul frontend.

Il Description_Search includerebbe lo stesso testo, ma attraversato un algoritmo di star-stem. Le query di ricerca sarebbero quindi basate su Description_Search campo, piuttosto che Description.

Questo ha senso? È uno spreco di spazio che deve archiviare due versione dello stesso testo?

Inoltre, lo farebbe Lucene.Net aiuto in tal caso? Sto anche cercando di integrare Lucene.net per ricerche basate sul testo completo, ma non ho ancora esaminato in dettaglio.

Grazie in anticipo!

È stato utile?

Soluzione

Non è necessario utilizzare due campi per questo, uno sarebbe sufficiente. Un campo ha due "valori", uno memorizzato che può essere recuperato usando Document.Get(...), e un indicizzato che viene utilizzato per la ricerca. Non è tecnicamente richiesto nemmeno per archiviare i valori, una soluzione comune è archiviare un ID utilizzato per cercare il contenuto originale in un database. Ciò consentirebbe anche di cercare maggiori informazioni, come le informazioni dell'autore e la posizione del documento.

Lucene.net ti aiuterebbe in questo caso, ma ti richiede di scrivere da soli l'infrastruttura. Dovresti occuparti di configurare gli analizzatori (di solito nulla da configurare) e indicizzare il contenuto. Come menzionato in un commento, potresti scegliere la funzionalità di ricerca di testo completa di SQL Server, ma questo ha alcune limitazioni (che potrebbero non influire su di te).

Un grosso problema che ho avuto usando gli FT di SQL Server, ma funziona in Lucene.net (questo non è davvero giusto dal momento che puoi fare quasi tutto in Lucene.net poiché scrivi il codice che lo fa) è la sensibilità dell'accento. Non sono stato in grado di configurarlo usando le regole del linguaggio svedese, dove åäö dovrebbe essere trattato come personaggi reali. Abilitare la sensibilità dell'accento farebbe questo, ma significherebbe anche che i diaritici sono analizzati come personaggi reali, il che significa che ciò ñ si differenzia da n. (Immagina di cercare un "jalapeno" e non ottenere corrispondenze per "jalapeño"). La sensibilità dell'accento disabilitante rimuove sostanzialmente tutti i diacritici, girando åäö in aao, e le parole risultano completamente diverse.

Scrivere cose in Lucene.net (rispetto a SQL Server FTS) consente di fornire un'evidenziazione dei risultati (presentare quali frasi in un documento che corrisponde alla query), cerca documenti simili, controllo ortografico, aumento dei risultati personalizzati, sfaccettature e altre cose Ciò migliorerebbe l'esperienza di ricerca dei tuoi utenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top