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月份每天所对应的结果
分享到:
相关推荐
《Lucene5学习之Facet(续)》 在深入探讨Lucene5的Facet功能之前,我们先来了解一下什么是Faceting。Faceting是搜索引擎提供的一种功能,它允许用户通过分类或属性对搜索结果进行细分,帮助用户更精确地探索和理解...
Lucene4.6版本,适用于Lucene的所有研究,以及中文分词功能
**Lucene Facet查询详解** Lucene是一款强大的全文搜索引擎库,广泛应用于各种信息检索系统。在处理大量数据时,为了帮助用户快速、有效地探索和理解数据,Lucene引入了Facets(方面)功能,它提供了分类浏览和统计...
《Lucene Facet 使用Bobo-Browse实现详解》 在信息检索领域,Lucene作为一款强大的全文搜索引擎,被广泛应用于各种复杂的数据检索场景。然而,随着数据量的日益增大,如何有效地对搜索结果进行分类和统计,即所谓的...
其中,Facet(分面)查询是Lucene提供的一种强大的分类和统计功能,它允许用户根据特定的维度(如作者、类别等)对搜索结果进行分组和计数,从而帮助用户更深入地探索数据。本篇文章将详细探讨Lucene的分组查询优化...
java运行依赖jar包
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
本文将围绕“Lucene5学习之拼音搜索”这一主题,详细介绍其拼音搜索的实现原理和实际应用。 首先,我们需要理解拼音搜索的重要性。在中文环境中,由于汉字的复杂性,用户往往习惯于通过输入词语的拼音来寻找信息。...
**标题:“Lucene5学习之SpellCheck拼写纠错”** 在深入探讨Lucene5的SpellCheck功能之前,首先需要理解Lucene是什么。Lucene是一个开源的全文检索库,由Apache软件基金会开发,它提供了高性能、可扩展的文本搜索...
总结起来,Lucene5学习之增量索引(Zoie)涉及到的关键技术点包括: 1. 基于Lucene的增量索引解决方案:Zoie系统。 2. 主从复制架构:Index Provider和Index User的角色。 3. 数据变更追踪:通过变更日志实现增量索引...
这篇博客“Lucene5学习之自定义Collector”显然聚焦于如何在Lucene 5版本中通过自定义Collector来优化搜索结果的收集过程。Collector是Lucene搜索框架中的一个重要组件,它负责在搜索过程中收集匹配的文档,并根据...
“Lucene5学习之排序-Sort”这个标题表明了我们要探讨的是关于Apache Lucene 5版本中的排序功能。Lucene是一个高性能、全文检索库,它提供了强大的文本搜索能力。在这个主题中,我们将深入理解如何在Lucene 5中对...
"Lucene5学习之Group分组统计" 这个标题指出我们要讨论的是关于Apache Lucene 5版本中的一个特定功能——Grouping。在信息检索领域,Lucene是一个高性能、全文搜索引擎库,而Grouping是它提供的一种功能,允许用户对...
《深入探索Lucene5 Spatial:地理位置搜索》 在信息技术飞速发展的今天,地理位置搜索已经成为许多应用和服务不可或缺的一部分。Apache Lucene作为一个强大的全文搜索引擎库,其在5.x版本中引入了Spatial模块,使得...
《Lucene5学习之Highlighter关键字高亮》 在信息技术领域,搜索引擎的使用已经变得无处不在,而其中的关键技术之一就是如何有效地突出显示搜索结果中的关键字,这就是我们今天要探讨的主题——Lucene5中的...
将`HanLP`与`Lucene5`结合使用,可以提升`Lucene5`的中文处理性能。具体实现步骤如下: 1. **集成HanLP**:首先,需要在项目中引入`HanLP`的依赖库,这通常通过Maven或Gradle等构建工具完成。确保引入的`HanLP`版本...
《深入探索Lucene5:Suggest关键字提示技术》 在信息检索领域,用户输入查询时,提供快速、准确的关键字提示能显著提升用户体验。Lucene,作为Java领域最流行的全文检索库,其5.x版本引入了Suggest组件,用于实现...
**标题解析:** "Lucene5学习之FunctionQuery功能查询" Lucene5是Apache Lucene的一个版本,这是一个高性能、全文本搜索库,广泛应用于搜索引擎和其他需要高效文本检索的系统。FunctionQuery是Lucene中的一种查询...