Facettes Lucene distribuées
Dans la recherche à facettes, vous obtenez les résultats des facettes, constitués des sous-catégories de certaines catégories. NCache prend désormais en charge Facets avec Distributed Lucene, qui vous aide à rechercher les documents souhaités de manière efficace et efficiente.
Le Lucene distribué prend en charge tous les types de facettes pris en charge par Lucene. Ces facettes sont classées dans les trois types suivants :
- Facettes basées sur la taxonomie : Ces facettes sont définies à l'aide d'une hiérarchie de catégories, appelée taxonomie.
- Facettes basées sur la plage : Ces facettes sont basées sur des plages dans lesquelles un
Numeric
orDateTime
champ tombe. - Facettes d'ensemble triées : Ces facettes ne nécessitent pas d'index de taxonomie distinct et calculent les décomptes en fonction des champs de valeurs de document définies triées.
Ces types de facettes sont expliqués ci-dessous avec leurs exemples de code respectifs.
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 votre application n'utilise aucune DLL/référence Lucene native.
- Pour plus de détails sur l'API, reportez-vous ici : NCacheAnnuaire, Collecteur de facettes, AnnuaireTaxonomyWriter, TaxoWriter, RépertoireTaxonomyReader, IndexWriterConfig, Version Lucene, Analyseur standard, IndexWriter, FacettesConfig, Recherche d'index, FastTaxonomyFacetCountsFastTaxonomyFacetCounts, FacetteRésultat, ObtenirTopChildren, Obtenir une valeur spécifique, ObtenirToutes les Dims, disposer, Champ NumericDocValues, SortedSetDocValuesFacetCounts, DefaultSortedSetDocValuesReaderState.
Facettes basées sur la taxonomie
Les AnnuaireTaxonomyWriter class vous permet de créer et d'ouvrir un rédacteur de taxonomie. Ouvrez d'abord le répertoire de taxonomie à l'intérieur d'un répertoire de taxonomie, et le RépertoireTaxonomyReader class vous permet d'ouvrir un lecteur de taxonomie sur un rédacteur de taxonomie.
Notes
Le Lucene distribué prend en charge toutes les facettes basées sur la taxonomie prises en charge par le Lucene.
Dans l'exemple suivant, les facettes sont créées avec le FastTaxonomoyaFacetCountsFastTaxonomoyaFacetCounts classe. Ils sont ensuite paramétrés, et ajoutés aux documents sous forme de champs à facettes. Plus tard, les résultats sont récupérés et vérifiés à l'aide du FacetteRésultat classe.
FacetsCollector facetCollector = null;
Facets facets = null;
DirectoryTaxonomyWriter taxoWriter = null;
Directory directory = null;
Directory taxoDir = null;
DirectoryTaxonomyReader taxoReader = null;
// Precondition: Lucene cache is already connected
string cache = "luceneCache";
string index = "luceneIndex";
string taxoIndex = "taxonomyIndex";
// Open NCache directory
directory = NCacheDirectory.Open(cache, index);
// Open taxonomy directory
taxoDir = NCacheDirectory.Open(cache, taxoIndex);
// Initialize taxonomy writer
taxoWriter = new DirectoryTaxonomyWriter(taxoDir, OpenMode.CREATE);
// Configure index writer and initialize it
var indexWriterConfig = new IndexWriterConfig(LuceneVersion.LUCENE_48, new StandardAnalyzer(LuceneVersion.LUCENE_48));
IndexWriter writer = new IndexWriter(directory, indexWriterConfig);
// Configure facets
FacetsConfig config = new FacetsConfig(cache);
config.SetHierarchical("Publish Date", true);
// Initialize document and add facet fields to it
Document document = new Document();
document.Add(new FacetField("Author", "Bob"));
document.Add(new FacetField("Publish Date", "2010", "10", "15"));
// Add document with facets config and taxonomy writer
writer.AddDocument(document, config, taxoWriter);
// Initialize index searcher
IndexSearcher indexSearcher = new IndexSearcher(writer.GetReader(true));
// Initialize taxonomy reader
taxoReader = new DirectoryTaxonomyReader(taxoWriter);
// Initialize facets collector
facetCollector = new FacetsCollector(false, cache);
// Search docs that match query and collect facets with facets collector
indexSearcher.Search(new MatchAllDocsQuery(), facetCollector);
// Initialize facets
facets = new FastTaxonomyFacetCounts(taxoReader, config, facetCollector);
// Retrieve & verify results:
FacetResult facetResult = facets.GetTopChildren(10, "Publish Date");
float Val = facets.GetSpecificValue("Publish Date");
IList<FacetResult> facetResults = facets.GetAllDims(10);
// Dispose all instances
facetCollector?.Dispose();
facets?.Dispose();
taxoWriter?.Dispose();
taxoReader?.Dispose();
taxoDir?.Dispose();
directory?.Dispose();
Facettes basées sur la plage
Dans l'exemple suivant, les facettes numériques sont créées à l'aide de la Int64RangeFacetCountsIntXNUMXRangeFacetCounts classe. Ces facettes sont ensuite ajoutées au document via le IndexWriter
. Les documents sont recherchés en fonction de ces facettes, et les résultats sont ensuite vérifiés.
Notes
Le Lucene distribué prend en charge toutes les facettes basées sur la plage prises en charge par le Lucene.
Directory directory = null;
IndexWriter writer = null;
IndexReader reader = null;
FacetsCollector facetCollector = null;
IndexSearcher indexSearcher = null;
Facets facets = null;
string cache = "luceneCache";
string index = "luceneIndex";
// Open NCache directory
directory = NCacheDirectory.Open(cache, index);
// Configure index writer and initialize it
var indexWriterConfig = new IndexWriterConfig(LuceneVersion.LUCENE_48, new StandardAnalyzer(LuceneVersion.LUCENE_48));
writer = new IndexWriter(directory, indexWriterConfig);
// Create a document
Document document = new Document();
// Create and add numeric fields to the document
NumericDocValuesField field = new NumericDocValuesField
("field", 0L);
document.Add(field);
for (long l = 0; l < 100; l++)
{
field.SetInt64Value(l);
writer.AddDocument(document);
}
// Also add Long.MAX_VALUE
field.SetInt64Value(long.MaxValue);
writer.AddDocument(document);
// Initialize index reader
reader = writer.GetReader(true);
// Initialize facets collector
facetCollector = new FacetsCollector(false, cache);
// Initialize index searcher
indexSearcher = new IndexSearcher(reader);
// Search docs that match query and collect facets with facets collector
indexSearcher.Search(new MatchAllDocsQuery(), facetCollector);
// Intialize facets
facets = new Int64RangeFacetCounts("field",
facetCollector, new Int64Range("less than 10", 0L, true, 10L, false),
new Int64Range("less than or equal to 10", 0L, true, 10L, true),
new Int64Range("over 90", 90L, false, 100L, false),
new Int64Range("90 or above", 90L, true, 100L, false),
new Int64Range("over 1000", 1000L,
false, long.MaxValue, true));
// Retrieve & verify results:
FacetResult facetResult = facets.GetTopChildren(10, "field");
finally
{
// Dispose all instances
facets?.Dispose();
indexSearcher?.Dispose();
facetCollector?.Dispose();
reader?.Dispose();
writer?.Dispose();
directory?.Dispose();
}
Facettes d'ensemble triées
Dans l'exemple suivant, les facettes d'ensemble trié sont créées avec le SortedSetDocValuesFacetCounts
classe. Ces facettes sont ensuite ajoutées au document, puis recherchées, et plus tard, les résultats sont vérifiés.
Directory directory = null;
IndexWriter writer = null;
IndexSearcher indexSearcher = null;
FacetsCollector facetCollector = null;
SortedSetDocValuesFacetCounts facets = null;
string cache = "luceneCache";
string index = "normalIndex";
// Open NCache directory
directory = NCacheDirectory.Open(cache, index);
// Initialize facets config
FacetsConfig config = new FacetsConfig(cache);
config.SetMultiValued("a", true);
// Initialize index writer
var indexWriterConfig = new IndexWriterConfig
(LuceneVersion.LUCENE_48, new StandardAnalyzer
(LuceneVersion.LUCENE_48));
writer = new IndexWriter(directory, indexWriterConfig);
// Create a document and add fields
Document document = new Document();
document.Add(new SortedSetDocValuesFacetField("a", "foo"));
document.Add(new SortedSetDocValuesFacetField("b", "foo"));
// Add sorted set facet field to document with facet config
writer.AddDocument(document, config);
// Commit writer
writer.Commit();
// Initialize index searcher
indexSearcher = new IndexSearcher(writer.GetReader(true));
// Per-top-reader state:
SortedSetDocValuesReaderState state = new
DefaultSortedSetDocValuesReaderState(indexSearcher.IndexReader);
// Initialize facets collector
facetCollector = new FacetsCollector(false, cache);
// Searcher docs that match query and collect facets with facet collector
indexSearcher.Search(new MatchAllDocsQuery(), facetCollector);
facets = new SortedSetDocValuesFacetCounts(state,
facetCollector);
// Retrieve & verify results:
FacetResult facetResult = facets.GetTopChildren(10, "a");
IList<FacetResult> facetResults = facets.GetAllDims(10);
finally
{
// Dipose all instances
facets?.Dispose();
facetCollector?.Dispose();
indexSearcher?.Dispose();
writer?.Dispose();
directory?.Dispose();
}
Ne pas disposer du Facets
, FacetCollector
, NCacheDirectory
, IndexReader
, IndexWriter
et DirectoryTaxonomyReader
entraînera une consommation de mémoire supplémentaire côté serveur.
Ressources additionnelles
NCache fournit également un exemple d'application pour les facettes dans le Lucene distribué sur GitHub
Voir aussi
.RAPPORTER: Lucene.Net.Facet espace de noms.