lucene(14)—lucene搜索之facet查询原理和facet查询实例
Facet说明
我们在浏览网站的时候,经常会遇到按某一类条件查询的情况,这种情况尤以电商网站最多,以天猫商城为例,我们选择某一个品牌,系统会将该品牌对应的商品展示出来,效果图如下:
如上图,我们关注的是品牌,选购热点等方面,对于类似的功能我们用lucene的term查询当然可以,但是在数据量特别大的情况下还用普通查询来实现显然会因为FSDirectory.open等耗时的操作造成查询效率的低下,同时普通查询是全部document都扫描一遍,这样显然造成了查询效率低;
lucene提供了facet查询用于对同一类的document进行聚类化,这样在查询的时候先关注某一个方面,这种显然缩小了查询范围,进而提升了查询效率;
facet模块提供了多个用于处理facet的统计和值处理的方法;
要实现facet的功能,我们需要了解facetField,FacetField定义了dim和此field对应的path,需要特别注意的是我们在做facetField索引的时候,需要事先调用FacetsConfig.build(Document);
FacetField的indexOptions设置为了DOCS_AND_FREQS_AND_POSITIONS的,即既索引又统计出现的频次和出现的位置,这样做主要是为了方便查询和统计;
相应的在存储的时候我们需要利用FacetsConfig和DirectoryTaxonomyWriter;
DirectoryTaxonomyWriter用来利用Directory来存储Taxono信息到硬盘;
DirectoryTaxonomyWriter的构造器如下:
|
|
由上述代码可知,DirectoryTaxonomyWriter先打开一个IndexWriter,在确保indexWriter打开和locked的前提下,读取directory对应的segments中需要提交的内容,如果读取到的内容为空,说明是上次的内容,设置indexEpoch为1,接着对cache进行设置;判断directory中是否还包含有document,如果有设置cacheIsComplete为false,反之为true;
时候不早了,今天先写到这里,明天会在此基础上补充,大家见谅
编程实践
我对之前的读取文件夹内容的做了个facet索引的例子
对BaseIndex修改了facet的设置,相关代码如下
|
|
相应得,document的索引需要利用DirectoryTaxonomyWriter来进行原有document的处理
|
|
测试facet功能的测试类:
|
|
相关代码下载