Panoramica del Lucene distribuito
Note:
Questa funzione è disponibile in NCache Impresa ed Piloti per l' Topologie partizionate solo.
NCache fornisce un Luceno modulo, che consente di utilizzare Lucene per la ricerca di testo con NCache. Ogni server di NCache dispone di un modulo Lucene dedicato. Ciò rende Lucene distribuito, scalabile e altamente disponibile con NCache.
Note:
NCache utilizza la versione 4.8 di Lucene.Net.
Perché usare Lucene con NCache?
Lucene, come sappiamo, è un motore di ricerca potente ed efficiente che fornisce una vasta gamma di tecniche di ricerca testuale per soddisfare le vostre esigenze aziendali. Lucene è molto più di qualsiasi altro motore di ricerca testuale poiché le scelte offerte all'utente sono molteplici. Dispone di potenti algoritmi di ricerca e supporta un'ampia gamma di query per la ricerca.
Sebbene sia potente come Lucene da solo, ha i suoi limiti. Lucene viene eseguito in-process nell'applicazione client. Ciò significa che Lucene non è scalabile e presenta un singolo punto di errore.
NCache fornisce un'implementazione distribuita di Lucene con modifiche minori nella sua API. Chiamate API di Lucene NCache al backend. NCache essendo distribuito in natura con Lucene fornisce una scalabilità di scrittura lineare poiché i documenti indicizzati dalle applicazioni vengono automaticamente distribuiti tra i nodi della cache dove vengono indicizzati separatamente.
Note:
Distributed Lucene utilizza un negozio Lucene separato e dedicato invece del NCache cache-store.
Allo stesso modo, Distributed Lucene fornisce anche scalabilità di lettura lineare poiché le query vengono propagate su ciascuna partizione e i risultati vengono uniti. Un numero maggiore di partizioni fornisce una maggiore scalabilità in lettura e scrittura. Gli indici Lucene vengono mantenuti sul tuo disco fisico. Maggiore è il numero di nodi, maggiore sarà la scalabilità, le prestazioni e la capacità di archiviazione per ospitare un numero elevato di documenti Lucene e dati indicizzati.
Funzionamento di Lucene Distribuita
Consigli
Si consiglia vivamente di utilizzare un SSD per indicizzare e cercare documenti Lucene anziché un HDD.
Il comportamento e il funzionamento di Lucene e Distributed Lucene sono quasi gli stessi con alcune modifiche. Il flusso di lavoro, la distribuzione dei dati e i componenti di Distributed Lucene sono spiegati nelle seguenti sezioni:
Flusso di lavoro Lucene distribuito
Il diagramma seguente mostra come funziona il modello Distributed Lucene.
L'applicazione client potrebbe voler indicizzare e analizzare (analizzati dagli analizzatori Lucene supportati) documenti o eseguire query su documenti indicizzati esistenti utilizzando l'API Lucene. Queste operazioni con l'API agiscono come chiamate di procedura remota (RPC) e vengono inoltrate direttamente al file NCache grappolo. Il cluster determina la natura di queste chiamate e le inoltra ai moduli Distributed Lucene collegati a ciascun nodo del server. Questi moduli eseguono queste chiamate e, a seconda della natura delle chiamate, avviene una delle seguenti azioni:
Richiesta documento chiamata: Nel caso si tratti di una chiamata di query, i moduli Distributed Lucene restituiscono i risultati al lato client, dove tutti questi risultati vengono uniti ed elaborati.
Invito documento indice: Nel caso in cui si tratti di una chiamata per indicizzare un documento, i moduli Distributed Lucene mantengono quel documento su un'unità disco.
Distribuzione dei dati
Viene generata una mappa di distribuzione rispetto a un cluster di cache. Per Lucene distribuita, viene generata questa mappa:
- Alla creazione della cache.
- Sull'aggiunta o rimozione di un nodo server.
avvertimento
Nel caso in cui la mappa di distribuzione non esista, la cache non si avvia e le eccezioni vengono registrate nel visualizzatore eventi e nei registri del servizio.
Questa mappa contiene informazioni relative ai bucket rispetto ai nodi della cache. Il numero totale di bucket per una cache Lucene distribuita è 100. Questi 100 bucket vengono distribuiti nel cluster utilizzando una strategia specifica.
Avere 100 bucket significa che un indice è suddiviso in 100 sottoindici nel cluster di cache. In base al numero di bucket assegnati a ciascun nodo, anche tutti i rispettivi file di indice vengono spostati su quel particolare nodo. Pertanto, ogni volta che il trasferimento dello stato provoca lo spostamento dei bucket nel cluster di cache, anche i file di indice corrispondenti vengono spostati come parte del processo.
Un nodo server può contenere più indici e ciascun indice all'interno di quel nodo server contiene bucket che gli vengono assegnati in base alla strategia di distribuzione del cluster. I documenti rispetto agli indici sono equamente distribuiti tramite questi bucket. Questi indici vengono mantenuti anche sull'unità fisica.
NCache ha runtime o distribuzione dinamica. L'avvio o l'arresto del nodo attiverà una modifica nella mappa di distribuzione del cluster di cache e attiverà il trasferimento dello stato. Tuttavia, nel NCache Lucene distribuito, gli indici vengono persistenti sull'unità fisica per evitare una distribuzione non necessaria degli indici all'avvio o all'arresto del nodo. Significa che dentro NCache Distributed Lucene, solo l'aggiunta o la rimozione di un nodo dal cluster di cache cambierà la mappa di distribuzione e attiverà il trasferimento dello stato per i nodi del server in esecuzione. Per i nodi del server interrotti, il trasferimento dello stato avverrà una volta tornati online.
Di seguito sono riportati alcuni punti importanti da considerare NCache Lucene distribuita:
- Mappa di distribuzione della cache: La mappa di distribuzione di una nuova cache viene generata solo quando la creazione della cache ha esito positivo. Se la generazione della mappa di distribuzione non riesce per qualche motivo, la creazione della cache viene ripristinata (ripristina).
- Trasferimento di Stato: Qualsiasi modifica nella configurazione dell'appartenenza al cluster di cache causerà modifiche nella mappa di distribuzione poiché ciò attiverà il trasferimento di stato nel cluster di cache.
- Aggiunta di nodi a un cluster esistente: In questo caso, tutti i nodi del server (anche quello che viene aggiunto) dovrebbero essere fisicamente disponibili e il loro servizio dovrebbe essere in esecuzione. Quando un nodo viene aggiunto al cluster di cache Distributed Lucene, la mappa di distribuzione esistente viene recuperata dai nodi del server esistenti. Una nuova mappa di distribuzione viene quindi generata e condivisa con tutti i nodi del server. Viene inviata una chiamata di commit per rendere persistente questa mappa di distribuzione.
- Rimozione del nodo da un cluster esistente: In questo caso, in modo simile all'aggiunta di nodi a un cluster esistente, tutti i nodi del server (tranne quello che viene rimosso) dovrebbero essere fisicamente disponibili e il loro servizio dovrebbe essere in esecuzione. In caso contrario, questa operazione avrà esito negativo.
- Spegnimento del nodo durante il trasferimento di stato: Se un nodo server si spegne durante il trasferimento di stato, il trasferimento di stato per quel nodo viene interrotto e ripreso dallo stesso bucket (dove il nodo si spegne) quando il nodo si riavvia.
Consigli
Nel caso dell'installazione per sviluppatori, i negozi possono configurare Distributed Lucene.
Inizializza Lucene distribuita
Prima di iniziare a utilizzare Distributed Lucene per indicizzare i tuoi documenti e successivamente cercarli, devi farlo inizializzazione prima. Dopo averlo inizializzato, è necessario fornire il nome della cache e il nome dell'indice.
Dati indice
Il processo di indicizzazione in Distributed Lucene è lo stesso di Lucene stesso. Nel caso di Lucene Distribuita, NCache mantiene un archivio di valori-chiave per la distribuzione dei documenti e a ciascun documento viene aggiunta una chiave generata automaticamente. Il documento è indicizzato sul nodo rispetto a quella chiave specifica.
Ricerca nell'indice
Una volta che Distributed Lucene è stato inizializzato e i documenti sono stati indicizzati, è possibile eseguire ricerche testuali su questi documenti.
sfaccettature
Una categoria è un aspetto essenziale di un documento indicizzato che viene utilizzato per classificarlo. Ad esempio, durante la ricerca di vestiti in un negozio e-commerce, le categorie dei vestiti possono essere prezzo, materiale, marca, ecc.
Nella ricerca sfaccettata, oltre ai normali risultati della ricerca, ottieni anche risultati sfaccettati, che consistono in sottocategorie per determinate categorie. Continuando l'esempio sopra, le sottocategorie per le sfaccettature del materiale possono essere cotone, lana, pelle, ecc.
La ricerca sfaccettata semplifica la ricerca di documenti specifici di cui hai bisogno. NCache ora supporta Facets con Distributed Lucene, che ti aiuterà nei documenti desiderati in modo efficiente ed efficace. Il funzionamento delle sfaccettature in Lucene e Distributed Lucene è sostanzialmente lo stesso ma con molti miglioramenti prestazionali evidenziati in Sfaccettature di lucene distribuite.
API geospaziale
I dati che contengono i valori delle coordinate di longitudine e latitudine sono indicati come Dati geospaziali. Questi dati sono utili se desideri cercare dati in base alla sua posizione. Ad esempio, desideri indicizzare un documento che contiene le informazioni di un ristorante. Questo documento contiene vari campi e uno di questi campi contiene i valori di longitudine e latitudine. Per cercare in futuro questo documento in base alla sua posizione (ad esempio il ristorante più vicino a te), ti consigliamo di indicizzare anche i campi di longitudine e latitudine.
Lucene ha una potente funzione di indicizzazione e ricerca dei dati geospaziali e ora NCache permette inoltre di indicizzare e quindi ricercare i documenti rispetto alla loro posizione con le API Lucene. Il seguente collegamento ti aiuterà a capire come indicizzare i dati e cercarli API distribuita di Lucene geospaziale .
Comportamento Lucene distribuito in un cluster parziale
Un cluster di cache viene dichiarato parziale quando uno o più nodi al suo interno diventano non disponibili. Pertanto, la connettività è limitata, rendendo il cluster di cache un cluster parziale. Il comportamento di Distributed Lucene in un cluster parziale è spiegato di seguito:
Leggi le operazioni su un cluster parziale
NCache Distributed Lucene consente di recuperare (leggere) i dati da un cluster parziale impostando il valore di AllowPartialResults
proprietà a TRUE
sul IndexReader
istanza di classe. Per impostazione predefinita, il valore di AllowPartialResults
flag è impostato su FALSE
.
Queste operazioni di lettura restituiranno dati parziali o incompleti. Tuttavia, nel caso di Topologia partizione-replica, il cluster di cache tollererà un errore di un singolo nodo attraverso la sua replica e sarai in grado di recuperare i dati completi. Ma, in caso di errori di più nodi, sarai in grado di recuperare solo dati parziali.
avvertimento
Se provi a leggere i dati da un cluster parziale e hai impostato il valore di AllowPartialResults
bandiera a FALSE
, verrà generata un'eccezione.
Scrivere operazioni su un cluster parziale
Distributed Lucene non consente di eseguire operazioni di scrittura come Aggiungi, Aggiorna ed Elimina su un cluster parziale. Se si tenta di eseguire queste operazioni su un cluster parziale, verrà generata un'eccezione.
API Lucene non supportata
Di seguito è riportato un elenco delle API Lucene non supportate in Distributed Lucene.
DirectoryReader
public static DirectoryReader Open(IndexCommit commit)
public static DirectoryReader Open(IndexCommit commit, int termInfosIndexDivisor)
public static DirectoryReader OpenIfChanged(DirectoryReader oldReader)
public static DirectoryReader OpenIfChanged(DirectoryReader oldReader, IndexCommit commit)
public static DirectoryReader OpenIfChanged(DirectoryReader oldReader, IndexWriter writer, bool applyAllDeletes)
IndexSearcher
public IndexSearcher(IndexReaderContext context, TaskScheduler executor)
public Document Document(int docID, ISet<string> fieldsToLoad)
public virtual Weight CreateNormalizedWeight(Query query)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, int n)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, Filter filter, int n)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, Filter filter, int n, Sort sort)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, int n, Sort sort)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, Filter filter, int n, Sort sort, bool doDocScores, bool doMaxScore)
IndexReader
public static DirectoryReader Open(Directory directory)
public static DirectoryReader Open(Directory directory, int termInfosIndexDivisor)
public static DirectoryReader Open(IndexWriter writer, bool applyAllDeletes)
public static DirectoryReader Open(IndexCommit commit)
public static DirectoryReader Open(IndexCommit commit, int termInfosIndexDivisor)
public IList<AtomicReaderContext> Leaves
NCacheDirectory
public override string[] ListAll()
public override long FileLength(string name)
public override void DeleteFile(string name)
public override string GetLockID()
public override IndexInput OpenInput(string name, IOContext context)
CompositeReader
public override sealed IndexReaderContext Context
Risorse addizionali
NCache fornisce un'applicazione di esempio per Distributed Lucene on GitHub.
Vedere anche
Componenti e panoramica di Lucene
Configura gli indici di query Lucene
Ricerca SQL nella cache
Cerca nella cache con LINQ