Recherche dans Lucene distribué
Les recherches sont effectuées après indexation des données. Pour rechercher les données, NCacheDirectory
est passé au IndexReader
. Plusieurs lecteurs d'index peuvent être ouverts sur un index soit via un IndexWriter
ou d’une NCacheDirectory
. L'exemple de la IndexReader
est passé au IndexSearcher
L’ IndexSearcher
est chargé de rechercher les données en fonction des requêtes données. Lucene fournit un large éventail de requêtes et le Lucene distribué prend en charge toutes les requêtes Lucene.
Notes
Cette fonctionnalité est également disponible dans NCache Professional.
Lucene.Net.Search.TopDocs.TotalHits
représente le nombre de meilleurs résultats obtenus à la suite de la recherche effectuée. Dans le cas du Lucene distribué, cette valeur est convertie à partir d'un integer
à long
. De même, les valeurs de Lucene.Net.Search.ScoreDocs.Doc
, Lucene.Net.Index.IndexReader.NumDoc
et Lucene.Net.Index.IndexReader.MaxDocs
sont également convertis à partir d'un integer
à long
.
Dans Distributed Lucene, si vous supprimez un Document
et appelle commit
, vous pourrez toujours lire le contenu des fichiers supprimés Document
via une instance d'un IndexReader
, à condition que cela IndexReader
a été ouvert avant que vous fassiez le commit
appel (après suppression). Si vous disposez de ceci IndexReader
après votre commit
appelez puis rouvrez-le, vous ne pourrez pas lire le contenu du Document
.
Vous pouvez récupérer les résultats même lorsque le cluster est partiel. NCache Lucene distribué fournit un AllowPartialResults
drapeau qui peut être défini sur TRUE
pour récupérer les données partielles. Par défaut, sa valeur est FALSE
.
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 à : Lecteur d'index, Recherche d'index, IndexWriter, NCacheAnnuaire, ObtenirReader, Version Lucene, Analyzer, Analyseur d'espaces blancs, Analyseur de requête, IndexWriterConfig.
Recherche de données
L'exemple de code ci-dessous montre comment vous pouvez rechercher vos documents indexés avec Distributed Lucene.
IndexReader reader = null;
IndexSearcher indexSearcher = null;
// Create a directory and open it on the cache and the index path
NCacheDirectory ncacheDirectory = NCacheDirectory.Open("demoCache",
"luceneIndex");
// Specify lucene version and analyzer type
LuceneVersion version = LuceneVersion.LUCENE_48;
Analyzer analyzer = new WhitespaceAnalyzer(version);
// 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 indexWriter = new IndexWriter(ncacheDirectory, new
IndexWriterConfig(LuceneVersion.LUCENE_48, analyzer));
// Open a new reader instance
// The 'applyAllDeletes' is set to true which means all enqueued deletes will be applied on the writer
reader = indexWriter.GetReader(true);
// OR
// reader = DirectoryReader.Open(indexWriter, true);
// OR
// reader = DirectoryReader.Open(ncacheDirectory, 1);
// Allow partial results in case of partial connectivity with cluster
reader.AllowPartialResults = true;
// A searcher is opened to perform searching
indexSearcher = new IndexSearcher(reader);
// Specify the searchTerm and the fieldName
string searchTerm = "Beverages";
string fieldName = "Category";
// Specify lucene version and analyzer type
LuceneVersion version = LuceneVersion.LUCENE_48;
Analyzer analyzer = new WhitespaceAnalyzer(version);
// Create a query parser and parse the query with the parser
QueryParser parser = new QueryParser(version, fieldName,
analyzer);
Query query = parser.Parse(searchTerm);
// Returns the top 10000 hits from the result set
ScoreDoc[] docsFound = indexSearcher.Search(query, 10000).
ScoreDocs;
// Please make sure that no operations should be performed after calling this
if (indexSearcher != null) indexSearcher.Dispose();
if (reader != null) reader.Dispose();
Notes
Tu devrais appeler Dispose
à la fin de chaque reader
Par exemple, sinon, il vit en mémoire et provoque des fuites de mémoire.
Ressources additionnelles
NCache fournit un exemple d'application pour rechercher des documents dans Distributed Lucene sur GitHub.
Voir aussi
.RAPPORTER: Lucene.Net.Recherche espace de noms.