Verteilte Lucene-Facetten
Bei der Facettensuche erhalten Sie Facettenergebnisse, die aus den Unterkategorien für bestimmte Kategorien bestehen. NCache Unterstützt jetzt Facets mit Distributed Lucene, das Sie bei der effizienten und effektiven Suche nach den gewünschten Dokumenten unterstützt.
Das verteilte Lucene unterstützt alle Facettentypen, die von unterstützt werden Lucene. Diese Facetten werden in die folgenden drei Typen eingeteilt:
- Taxonomiebasierte Facetten: Diese Facetten werden mithilfe einer Hierarchie von Kategorien definiert, die als Taxonomie bezeichnet wird.
- Bereichsbasierte Facetten: Diese Facetten basieren auf Bereichen, in die a
Numeric
orDateTime
Feld fällt. - Sortierte Set-Facetten: Diese Facetten erfordern keinen separaten Taxonomieindex und berechnen die Anzahl stattdessen auf der Grundlage der sortierten Dokumentwertfelder.
Diese Facettentypen werden unten mit ihren jeweiligen Codebeispielen erläutert.
Voraussetzungen:
- Lernen Sie die Standardvoraussetzungen kennen, die für die Arbeit mit allen erforderlich sind NCache Weitere Informationen zu clientseitigen Funktionen finden Sie auf der angegebenen Seite Clientseitige API-Voraussetzungen.
- Stellen Sie sicher, dass Sie über die einen Lucene-Cache erstellt und gestartet haben NCache Management Center or Befehlszeilenschnittstelle.
- Stellen Sie sicher, dass Ihre Anwendung keine native Lucene-DLL/-Referenz verwendet.
- Einzelheiten zur API finden Sie hier: NCacheVerzeichnis, FacettenSammler, DirectoryTaxonomyWriter, TaxoWriter, DirectoryTaxonomyReader, IndexWriterConfig, LuceneVersion, StandardAnalyzer, IndexWriter, FacettenKonfig, IndexSucher, FastTaxonomyFacetCounts, Facettenergebnis, GetTopChildren, GetSpecificValue, GetAllDims, Entsorgen, NumericDocValuesField, SortedSetDocValuesFacetCounts, DefaultSortedSetDocValuesReaderState.
Taxonomiebasierte Facetten
Das DirectoryTaxonomyWriter -Klasse können Sie einen Taxonomie-Writer erstellen und öffnen. Öffnen Sie zuerst das Taxonomieverzeichnis in einem Taxonomieverzeichnis und die DirectoryTaxonomyReader Mit der Klasse können Sie einen Taxonomie-Reader auf einem Taxonomie-Writer öffnen.
Note
Das Distributed Lucene unterstützt alle taxonomiebasierten Facetten, die von Lucene unterstützt werden.
Im folgenden Beispiel werden Facetten mit erstellt FastTaxonomoyFacetCounts Klasse. Anschließend werden sie konfiguriert und in Form der Facettenfelder den Dokumenten hinzugefügt. Später werden die Ergebnisse mit Hilfe des abgerufen und überprüft Facettenergebnis Klasse.
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();
Bereichsbasierte Facetten
Im folgenden Beispiel werden die numerischen Facetten mit erstellt Int64RangeFacetCounts Klasse. Diese Facetten werden dann über den zum Dokument hinzugefügt IndexWriter
. Basierend auf diesen Aspekten werden Dokumente durchsucht und die Ergebnisse anschließend überprüft.
Note
Das verteilte Lucene unterstützt alle bereichsbasierten Facetten, die von Lucene unterstützt werden.
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();
}
Sortierte Set-Facetten
Im folgenden Beispiel werden die Facetten des sortierten Satzes mit erstellt SortedSetDocValuesFacetCounts
Klasse. Diese Facetten werden dann dem Dokument hinzugefügt, dann durchsucht und später die Ergebnisse verifiziert.
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();
}
Warnung
Nicht entsorgen Facets
, FacetCollector
, NCacheDirectory
, IndexReader
, IndexWriter
und DirectoryTaxonomyReader
führt zu einem zusätzlichen Speicherverbrauch auf der Serverseite.
Weitere Informationen
NCache stellt auch eine Beispielanwendung für die Facetten in Distributed Lucene bereit GitHub
Siehe auch
.NETZ: Lucene.Net.Facet Namespace.