Indexer les données dans Lucene distribué
Distributed Lucene permet une recherche efficace en indexant les documents, où les index doivent être créés et stockés dans un répertoire. La première étape consiste à initialiser le répertoire qui stocke les index. Contrairement à Lucene.NET, NCacheDirectory
est utilisé pour ouvrir un répertoire en spécifiant le nom du cache et le nom de l'index.
Notes
Cette fonctionnalité est également disponible dans NCache Professional.
Notes
Le chemin par défaut du répertoire d'index est C: \ ProgramData \ncache\lucene-index\{CACHE_NAME}\data pour Windows, et /utilisateur/partage/ncache/lucene-index/{CACHE_NAME}/data pour Linux.
Une fois le répertoire initialisé, IndexWriter
est ouvert en fournissant l'instance de NCacheDirectory
et par IndexWriterConfig. IndexWriter
ajoute et indexe les documents sur l'index avec le même mécanisme que dans le Lucene.NET en utilisant le AddDocument
méthode.
Notes
Pour la répartition des documents entre les serveurs de cache, NCache ajoute automatiquement un TextField
avec une DocKey
champ et une valeur GUID générée automatiquement à un document s'il n'est pas spécifié par l'utilisateur.
Toutes les opérations d'écriture effectuées sur les index sont synchrones. Ils ne sont donc restitués à l'utilisateur qu'à l'issue desdites opérations. Cela ajoute de la cohérence et de l’intégrité des données au Lucene distribué.
Important
Pour toute opération d'écriture sur le graveur, nous devons appeler le Commit
pour l'enregistrer dans le répertoire des documents. Commit doit être appelé, sinon il ne sauvegardera pas les opérations d'écriture et pourrait également avoir un impact sur les opérations de recherche sur les documents ajoutés.
Contrairement à Lucene.NET, vous pouvez ouvrir plusieurs rédacteurs sur le même répertoire pour une indexation parallèle. Lorsque le document est rédigé, IndexWriter.Commit
est appelée pour conserver le document et le rendre consultable. Une fois la IndexWriter
sert à indexer les données, IndexWriter.Dispose
doit être appelée pour libérer les ressources utilisées.
Conseil
Vous pouvez obtenir des informations sur l'achèvement des opérations d'écriture sur une instance à l'aide de la NCache à condition de Boolean
propriété IndexWriter.OperationsCompleted
.
Pré-requis
- Pour en savoir plus sur les prérequis standard requis pour travailler avec tous NCache fonctionnalités côté client, veuillez vous référer à la page donnée sur Prérequis de l'API côté client.
- Assurez-vous que vous avez créé et démarré un cache Lucene via le NCache Centre de gestion or Interface de ligne de commande.
- Assurez-vous que Notifications aux clients sont activés.
- Assurez-vous que votre application n'utilise aucune DLL/référence Lucene native.
- Pour plus de détails sur l'API, reportez-vous à : NCacheAnnuaire, Analyzer, Analyseur d'espace blanc, IndexWriter, IndexWriterConfig, S’ENGAGER, AjouterDocument, Documents.
Données d'indexation
L'exemple suivant ouvre d'abord le NCacheDirectory
en spécifiant le nom du cache comme LucèneCache et le nom de l'index comme Index des produits. Ensuite, il ouvre un IndexWriter
sur le répertoire spécifié en spécifiant le Analyseur d'espaces blancs pour analyser les données.
Les opérations d'écriture d'index ne sont pas autorisées en cas de grappe partielle.
// Specify the Distributed-Lucene cache name
string cache = "LuceneCache";
// Specify the index name to create the indexes
string indexName = "ProductIndex";
NCacheDirectory ncacheDirectory = null;
IndexWriter indexWriter = null;
//Initializing
// Create a directory and open it on the cache and the index path
ncacheDirectory = NCacheDirectory.Open(cache, indexName);
// Specify the analyzer used to analyze data
Analyzer analyzer = new WhitespaceAnalyzer(LuceneVersion.LUCENE_48);
// Create an indexWriterConfig which holds all the configurations to create an instance of the writer
IndexWriterConfig config = new IndexWriterConfig(LuceneVersion.
LUCENE_48, analyzer);
// Create an instance of the writer
indexWriter = new IndexWriter(ncacheDirectory, new IndexWriterConfig
(LuceneVersion.LUCENE_48, _analyzer));
// Indexing
// Add the products information that is to be indexed
Product[] products = FetchProductsFromDB();
foreach (var prod in products)
{
// Create a document and add fields to it
Document doc = new Document();
doc.Add(new TextField("ProductID", prod.ProductID.ToString(),
Field.Store.YES));
doc.Add(new TextField("ProductName", prod.ProductName, Field.Store.NO));
doc.Add(new TextField("Category", prod.Category, Field.Store.YES));
doc.Add(new TextField("Description", prod.Description, Field.Store.YES));
// Writer is created previously
indexWriter.AddDocument(doc);
}
// Calling commit on the writer saves all the write operations
indexWriter.Commit();
if(indexWriter.OperationsCompleted)
{
// All writing operations are complete
// Can proceed with other operations such as querying
}
// Dispose the indexWriter after indexing
if (indexWriter != null) indexWriter.Dispose();
// Dispose the ncacheDirectory
if (ncacheDirectory != null) ncacheDirectory.Dispose();
Notes
Tu devrais appeler Dispose
à la fin de chaque writer
Par exemple, sinon, il vit en mémoire et provoque des fuites de mémoire.
Ressources additionnelles
NCache fournit un exemple d'application pour Distributed Lucene sur GitHub.
Voir aussi
.RAPPORTER: Lucene.Net.Index espace de noms.