比如你索引了一些本地文件,然后某个查询返回了1000个文件结果,其中包含100个txt,200个pdf,300个word,400个html。
这时就可以有这些Facet信息.
txt - 100
pdf - 200
word - 300
html - 400
这个内容可以显示在搜索的页面上。
1. 给Facet信息创建index
Lucene实现的Facet需要在正常的索引文件之外再创建另一个index, 所以我们在创建索引的时候需要两个IndexWriter以及一个FacetConfig对象
a)
FacetsConfig facetsConfig = new FacetsConfig(); IndexWriter writer = new IndexWriter(FSDirectory.open(Paths.get("D:\\a")), IndexWriterConfig) DirectoryTaxonomyWriter taxoWriter = new DirectoryTaxonomyWriter(FSDirectory.open(Paths.get("D:\\b")));
b) 创建document的时候除了正常需要索引的字段之外,添加Facet字段,以索引本地文件为例
Document document = new Document(); document.add(new StringField("fileName", fileName, Store.YES)); document.add(new FacetField("fileType", new String[]{fileType}));
在调用 indexWriter.addDocument()之前需要处理一下
document = facetsConfig.build(taxoWriter, document);
将两个writer关闭,索引就创建好了。
2. 查询Facet信息
先来看看没有层次关系的Facet查询. 现在有一个Query,可以是TermQuery,PhraseQuery或者任意的一个Query,我们想要知道这个Query查询出的结果中的fileType的集合信息。
除了正常查询需要的IndexSearcher实例之外,还需要前面创建的Facet索引的Reader实例:
TaxonomyReader taxoReader = new DirectoryTaxonomyReader(FSDirectory.open(Paths.get("D:\\b"))); FacetsCollector fc = new FacetsCollector(); FacetsCollector.search(indexSearcher, query, 500, fc); Facets facets = new FastTaxonomyFacetCounts(taxoReader, facetsConfig, fc); FacetResult facetResult = facets.getTopChildren(30, "fileType"); LabelAndValue[] labels = facetResult.labelValues;
lables里面就包含了所有的fileType以及每种fileType所对应的总数。
3. 具有层次关系的Facet
有的时候我们需要展现一些有层次的Facet信息,比如文档归类,
2014(100), 2015 (200), 2016(300)...
表示在2014年创建的文档有100个,2015年的有200个,2016年的有300个,
然后在2014(100)这个节点下面我们想加上一些子节点,01(5), 02(10), 05(30)...此类的表示在2014年1月份创建的文档有5个,2月份有10个...
a) 在创建索引的时候需要将层次信息按顺序输进去,例如 年、月、日,还要在facetsConfig中配置一下
document.add(new FacetField("date", new String[]{"2015", "09", "25"})); facetsConfig.setHierarchical("date", true);
b) 如果我们继续使用前面查询Facets的方式,我们会得到这样的信息
2014(100), 2015 (200), 2016(300)...
默认是只查询第一层的信息 (I guess)
如果我们想知道2014(100)里面关于每个月所拥有的文档的信息,就要用到 DrillDownQuery 了。
DrillDownQuery q = new DrillDownQuery(facetsConfig); q.add("date", new String[] { "2014" }); FacetsCollector fc = new FacetsCollector(); FacetsCollector.search(searcher, q, 10, fc); Facets facets = new FastTaxonomyFacetCounts(taxoReader, facetsConfig, fc); FacetResult facetResult = facets.getTopChildren(15, "date", new String[]{"2014"}); LabelAndValue[] labels = facetResult.labelValues;
labels里面就包含了每个月份所对应的文档树。
如果想查询2014年1月份里面每天所对应的信息,只需要将查询条件更改一下
q.add("date", new String[] { "2014" ,"01"}); FacetResult facetResult = facets.getTopChildren(15, "date", new String[]{"2014", "01"});
c)有时在查看某个Facet值所对应的具体的结果时,同时也想知道其他Facet值所对应的信息。比如有个链接对应2014(100),点进去之后查看这100条具体信息,同时希望页面上也能显示其他年份所对应的记录,这时需要用到DrillSideways.
DrillDownQuery q = new DrillDownQuery(facetsConfig); q.add("date", new String[0]); DrillSideways ds = new DrillSideways(searcher, facetsConfig, taxoReader); DrillSideways.DrillSidewaysResult result = ds.search(q, 10); ListyearFacets = result.facets.getAllDims(20); FacetResult monthFacets = result.facets.getTopChildren(12, "date", new String[]{"2014"}); FacetResult dateFacets = result.facets.getTopChildren(30, "date", new String[]{"2014", "10"});
yearFacets 不同的年份对应的结果
monthFacets 2014年每个月份所对应的结果
dateFacets 2014年10月份每天所对应的结果