Facetas de Lucene distribuidas
En la búsqueda por facetas, obtienes resultados por facetas, que constan de subcategorías para determinadas categorías. NCache ahora admite Facetas con Distributed Lucene, que le ayuda a buscar los documentos deseados de forma eficiente y eficaz.
Distributed Lucene admite todos los tipos de facetas admitidos por Lucene. Estas facetas se clasifican en los siguientes tres tipos:
- Facetas basadas en taxonomía: Estas facetas se definen mediante una jerarquía de categorías, conocida como taxonomía.
- Facetas basadas en rango: Estas facetas se basan en rangos en los que un
Numeric
orDateTime
caídas de campo. - Facetas de conjuntos ordenados: Estas facetas no requieren un índice de taxonomía separado y, en su lugar, calculan los recuentos en función de los campos de valores de documentos establecidos ordenados.
Estos tipos de facetas se explican a continuación con sus respectivos ejemplos de código.
Requisitos previos
- Para obtener información sobre los requisitos previos estándar necesarios para trabajar con todos NCache características del lado del cliente, consulte la página proporcionada en Requisitos previos de la API del lado del cliente.
- Asegúrese de haber creado e iniciado un caché de Lucene a través del NCache Centro de gestion or Interfaz de línea de comandos.
- Asegúrese de que su aplicación no utilice ninguna DLL/referencia nativa de Lucene.
- Para obtener detalles de la API, consulte aquí: NCacheDirectorio, Coleccionista de facetas, Escritor de taxonomía de directorio, taxista, Lector de taxonomía de directorio, Configuración de IndexWriter, LuceneVersión, Analizador estándar, Escritor de índices, Configuración de facetas, Buscador de índices, FastTaxonomyFacetCounts, Resultado de la faceta, ObtenerTopNiños, ObtenerValorEspecífico, ObtenerTodasDims, tiene, NumericDocValuesFieldNumericDocValuesFieldNumericDocValuesField, OrdenadoSetDocValuesFacetCounts, DefaultSortedSetDocValuesReaderState.
Facetas basadas en taxonomía
El Escritor de taxonomía de directorio class le permite crear y abrir un escritor de taxonomías. Abra el directorio de taxonomía primero dentro de un directorio de taxonomía, y el Lector de taxonomía de directorio class le permite abrir un lector de taxonomía en un escritor de taxonomía.
Note
Distributed Lucene admite todas las facetas basadas en taxonomía admitidas por Lucene.
En el siguiente ejemplo, las facetas se crean con el FastTaxonomoyFacetCounts clase. Luego se configuran y se agregan a los documentos en forma de campos de facetas. Posteriormente, los resultados se recuperan y verifican con la ayuda del Resultado de la faceta clase.
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();
Facetas basadas en rango
En el siguiente ejemplo, las facetas numéricas se crean usando el Int64RangeFacetCounts clase. Estas facetas luego se agregan al documento a través del IndexWriter
. Los documentos se buscan en función de estas facetas y los resultados se verifican posteriormente.
Note
Distributed Lucene admite todas las facetas basadas en rango admitidas por 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();
}
Facetas de conjuntos ordenados
En el siguiente ejemplo, las facetas de conjuntos ordenados se crean con el SortedSetDocValuesFacetCounts
clase. Estas facetas luego se agregan al documento, luego se buscan y luego se verifican los resultados.
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();
}
advertencia
No disponer del Facets
, FacetCollector
, NCacheDirectory
, IndexReader
, IndexWriter
y DirectoryTaxonomyReader
dará lugar a un consumo de memoria adicional en el lado del servidor.
Recursos adicionales
NCache también proporciona una aplicación de muestra para Facets en Distributed Lucene en GitHub
Vea también
.NETO: Lucene.Net.Faceta espacio de nombres