[英]Lucene use taxonomy and DocValues facets together
有许多基于分类索引和DocValues使用构面的示例。 但我需要将类别(分类法)和范围查询(NumericDocValuesField)一起用作层次结构。 例如DrillSideways:
DrillSideways ds = new DrillSideways (searcher, config, taxoReader);
DrillSideways.DrillSidewaysResult result = ds.search (q, topScoreDocCollector);
ds.search()的第二个参数是TopScoreDocCollector 。
FacetsCollector在ds.search()内部创建,因此无法将此收集器传递给ds.search() 。 传递MultiCollector.wrap(FacetsCollector,TopScoreDocCollector)作为ds.search()中的第二个参数不正确(?)。 但是, FacetsCollector需要构建分类索引中不可用的构面:
Facets facetsTime = new LongRangeFacetCounts (..., FacetsCollector, ...);
facetsTime.getTopChildren (...);
还列出result.facet包含null值,该值引用DocValues facet。
也许您有一个可行的示例,如何在DrillSideways中一起使用分类法和DocValues方面。
DrillSideways
假定您仅使用TaxonomyFacets或SortedSetDocValuesFacets。 如果不是这种情况,则可以对DrillSideways进行子类化,并覆盖buildFacetsResult
方法以构建最终的Facet(如果您愿意)。 您将获得用于DrillDownQuery的FacetsCollector和两个带有侧面FacetCollectors和暗淡的数组,对于您添加到DrissSideways中的每个暗淡而言。
这是一个例子:
public class MyDrillSideways extends DrillSideways {
public MyDrillSideways(IndexSearcher searcher, FacetsConfig config, TaxonomyReader taxoReader) {
super(searcher, config, taxoReader);
}
@Override
protected Facets buildFacetsResult(FacetsCollector drillDowns, FacetsCollector[] drillSideways, String[] drillSidewaysDims) throws IOException {
String longRangeFacetDim = "mySpecialLongRangeDim";
Facets drillDownFacets = new FastTaxonomyFacetCounts(taxoReader, config, drillDowns);
boolean foundLongRangeInDrillSideways = false;
Map<String, Facets> drillSidewaysFacets = new HashMap<>();
if (drillSideways != null) {
for (int i = 0; i < drillSideways.length; i++) {
String sidewaysDim = drillSidewaysDims[i];
FacetsCollector drillSideway = drillSideways[i];
Facets sidewaysFacets;
if (sidewaysDim.equals(longRangeFacetDim)) {
foundLongRangeInDrillSideways = true;
sidewaysFacets = new LongRangeFacetCounts(...,drillSideway,...);
} else {
sidewaysFacets = new FastTaxonomyFacetCounts(taxoReader, config, drillSideway);
}
drillSidewaysFacets.put(sidewaysDim, sidewaysFacets);
}
}
if (!foundLongRangeInDrillSideways) {
Facets facetsTime = new LongRangeFacetCounts(..., FacetsCollector, ...);
drillSidewaysFacets.put(longRangeFacetDim, facetsTime);
}
return new MultiFacets(drillSidewaysFacets, drillDownFacets);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.