분산된 Lucene 패싯
패싯 검색에서는 특정 카테고리에 대한 하위 카테고리로 구성된 패싯 결과를 얻습니다. NCache 이제 원하는 문서를 효율적이고 효과적으로 검색하는 데 도움이 되는 Distributed Lucene으로 Facets를 지원합니다.
분산 Lucene은 다음에서 지원하는 모든 패싯 유형을 지원합니다. 루센. 이러한 패싯은 다음 세 가지 유형으로 분류됩니다.
- 분류 기반 패싯: 이러한 패싯은 분류라고 알려진 범주 계층을 사용하여 정의됩니다.
- 범위 기반 패싯: 이러한 패싯은
Numeric
orDateTime
들판이 떨어진다. - 정렬된 세트 패싯: 이러한 패싯에는 별도의 분류 색인이 필요하지 않으며 대신 정렬된 문서 값 필드를 기준으로 개수를 계산합니다.
이러한 패싯 유형은 각각의 코드 예제와 함께 아래에 설명되어 있습니다.
사전 조건
- 모든 작업에 필요한 표준 전제 조건에 대해 알아보려면 NCache 클라이언트측 기능은 다음 페이지를 참조하세요. 클라이언트 측 API 전제 조건.
- 다음을 통해 Lucene 캐시를 만들고 시작했는지 확인하십시오. NCache 관리 센터 or 명령 행 인터페이스.
- 애플리케이션이 기본 Lucene DLL/참조를 사용하고 있지 않은지 확인하십시오.
- API 세부 정보는 여기를 참조하세요. NCache명부 담당, 패싯 수집기, 디렉토리분류작성기, 택소라이터, 디렉토리분류리더, 색인 작성기 구성, Lucene 버전, 표준 분석기, 인덱스 라이터, 패싯 구성, 인덱스 검색자, FastTaxonomyFacetCounts, 패싯 결과, GetTopChildren, 특정값 얻기, GetAllDims, 이, NumericDocValues필드, SortedSetDocValuesFacetCounts, DefaultSortedSetDocValuesReaderState.
분류 기반 패싯
XNUMXD덴탈의 디렉토리분류작성기 클래스를 사용하면 분류 작성자를 만들고 열 수 있습니다. 먼저 분류 디렉토리 내에서 분류 디렉토리를 열고 디렉토리분류리더 클래스를 사용하면 분류 작성기에서 분류 판독기를 열 수 있습니다.
주의 사항
분산 Lucene은 Lucene에서 지원하는 모든 분류 기반 패싯을 지원합니다.
다음 예에서 패싯은 다음을 사용하여 생성됩니다. FastTaxonomoyFacetCounts 수업. 그런 다음 패싯 필드 형식으로 구성되고 문서에 추가됩니다. 나중에 결과는 다음의 도움으로 검색되고 확인됩니다. 패싯 결과 클래스입니다.
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();
범위 기반 패싯
다음 예에서 숫자 패싯은 다음을 사용하여 생성됩니다. Int64RangeFacet카운트 수업. 이러한 패싯은 다음을 통해 문서에 추가됩니다. 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();
}
정렬된 세트 패싯
다음 예에서 Sorted Set Facets는 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 또한 에서 Distributed Lucene의 패싯에 대한 샘플 애플리케이션을 제공합니다. GitHub의
도 참조
.그물: Lucene.Net.Facet 네임 스페이스.