分布式 Lucene 方面
在分面搜索中,您将获得分面结果,其中包含某些类别的子类别。 NCache 现在通过分布式 Lucene 支持 Facets,这可以帮助您高效且有效地搜索所需的文档。
Distributed Lucene 支持所有的 facet 类型 Lucene. 这些方面分为以下三种类型:
- 基于分类的方面: 这些方面是使用称为分类的类别层次结构定义的。
- 基于范围的方面: 这些方面基于范围
Numeric
orDateTime
场下降。 - 排序集方面: 这些方面不需要单独的分类索引,而是根据排序后的文档值字段计算计数。
这些方面类型在下面用它们各自的代码示例进行了解释。
先决条件
- 了解与所有人员合作所需的标准先决条件 NCache 客户端功能请参阅给定页面 客户端 API 先决条件.
- 确保您已经通过 NCache 管理中心 or 命令行界面.
- 确保您的应用程序没有使用任何本机 Lucene DLL/Reference。
- 有关 API 详细信息,请参阅此处: NCache目录, 刻面收藏家, 目录分类编写器, 分类编辑器, 目录分类阅读器, 索引写入器配置, Lucene版本, 标准分析仪, 索引写入器, 构面配置, 索引搜索器, 快速分类分面计数, 分面结果, 获得顶级儿童, 获取特定值, 获取所有尺寸, 部署, NumericDocValues 字段, SortedSetDocValuesFacetCounts, DefaultSortedSetDocValuesReaderState.
基于分类的方面
目录分类编写器 类允许您创建和打开分类法编写器。 首先在分类目录中打开分类目录,然后 目录分类阅读器 类允许您在分类编写器上打开分类阅读器。
备注
分布式 Lucene 支持 Lucene 支持的所有基于分类的方面。
在以下示例中,分面是使用 快速分类法 FacetCounts 班级。 然后对它们进行配置,并以构面字段的形式添加到文档中。 随后,在 分面结果 类。
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();
基于范围的构面
在以下示例中,数字方面是使用 Int64RangeFacetCounts 班级。 这些方面然后通过 IndexWriter
。 根据这些方面搜索文档,然后对结果进行验证。
备注
分布式 Lucene 支持 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();
}
排序集方面
在以下示例中,使用 SortedSetDocValuesFacetCounts
班级。 然后将这些方面添加到文档中,然后进行搜索,然后验证结果。
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();
}
警告
不丢弃 Facets
, FacetCollector
, NCacheDirectory
, IndexReader
, IndexWriter
及 DirectoryTaxonomyReader
将导致服务器端的额外内存消耗。
更多资讯
NCache 还为分布式 Lucene 上的 Facets 提供了示例应用程序 GitHub上
参见
.NET: Lucene.Net.Facet 命名空间。