Lucene5 Facet DrillDownQuery DrillSideways 学习

Facet 是用来统计你的查询结果在某个事先索引的字段下的信息。
比如你索引了一些本地文件,然后某个查询返回了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);
List<FacetResult> yearFacets = 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月份每天所对应的结果

猜你喜欢

转载自gaoshuaidage.iteye.com/blog/2296423