Facetas Distribuídas de Lucene
Na pesquisa facetada, você obtém os resultados facetados, que consistem nas subcategorias de determinadas categorias. NCache agora suporta Facets com o Distributed Lucene, que auxilia na busca dos documentos desejados de forma eficiente e eficaz.
O Distributed Lucene suporta todos os tipos de faceta suportados por lucene. Essas facetas são categorizadas nos três tipos a seguir:
- Facetas baseadas na taxonomia: Essas facetas são definidas usando uma hierarquia de categorias, conhecida como taxonomia.
- Facetas baseadas em intervalo: Essas facetas são baseadas em intervalos nos quais um
Numeric
orDateTime
campo cai. - Facetas de conjunto classificadas: Essas facetas não exigem um índice de taxonomia separado e, em vez disso, calculam as contagens com base nos campos de valores do documento do conjunto classificado.
Esses tipos de faceta são explicados abaixo com seus respectivos exemplos de código.
Pré-requisitos
- Para aprender sobre os pré-requisitos padrão necessários para trabalhar com todos os NCache recursos do lado do cliente, consulte a página fornecida em Pré-requisitos da API do lado do cliente.
- Certifique-se de ter criado e iniciado um cache do Lucene por meio do NCache Centro de Gerenciamento or Interface da Linha de comando.
- Certifique-se de que seu aplicativo não esteja usando nenhuma DLL/referência nativa do Lucene.
- Para detalhes da API, consulte aqui: NCacheDiretório, Coletor de facetas, DiretórioTaxonomiaEscritor, TaxoWriter, DiretórioTaxonomyReader, IndexWriterConfig, LuceneVersão, Standard Analyzer, IndexWriter, FacetasConfig, Pesquisador de índice, FastTaxonomyFacetCounts, FacetaResultado, GetTopChildren, Obter valor específico, ObterTodosDims, dispor, NumericDocValuesField, SortedSetDocValuesFacetCounts, DefaultSortedSetDocValuesReaderState.
Facetas baseadas em taxonomia
A DiretórioTaxonomiaEscritor classe permite que você crie e abra um gravador de taxonomia. Abra o diretório de taxonomia primeiro dentro de um diretório de taxonomia e o DiretórioTaxonomyReader class permite que você abra um leitor de taxonomia em um escritor de taxonomia.
Note
O Distributed Lucene oferece suporte a todas as facetas baseadas em taxonomia suportadas pelo Lucene.
No exemplo a seguir, as facetas são criadas com o FastTaxonomoyFacetCounts aula. Eles são então configurados e adicionados aos documentos na forma de campos de faceta. Posteriormente, os resultados são recuperados e verificados com a ajuda do FacetaResultado 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();
Facetas baseadas em intervalo
No exemplo a seguir, as facetas numéricas são criadas usando o Int64RangeFaceCounts aula. Essas facetas são então adicionadas ao documento por meio do IndexWriter
. Os documentos são pesquisados com base nessas facetas e os resultados são verificados posteriormente.
Note
O Distributed Lucene suporta todas as facetas baseadas em intervalo suportadas pelo 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 conjunto classificadas
No exemplo a seguir, as facetas do conjunto classificado são criadas com o SortedSetDocValuesFacetCounts
aula. Essas facetas são adicionadas ao documento, depois pesquisadas e, posteriormente, os resultados são verificados.
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();
}
Aviso
Não descartando o Facets
, FacetCollector
, NCacheDirectory
, IndexReader
, IndexWriter
e DirectoryTaxonomyReader
levará a um consumo extra de memória no lado do servidor.
Recursos adicionais
NCache também fornece um aplicativo de amostra para Facets no Distributed Lucene em GitHub
Veja também
.INTERNET: Lucene.Net.Facet espaço para nome.