IndexSearcher排序
本文主要讲解:
1.IndexSearcher中和排序相关的方法及sort类、SortField类(api级别);
2.按文档得分进行排序;
3.按文档内部id进行排序;
4.数值型、日期型排序注意事项;
5.多Field排序;
6.通过改变boost值来改变文档的得分。
----------------------------------------------------------------------
1.IndexSearcher中和排序相关的方法及sort类、SortField类(api级别);
用IndexSearcher直接排序一般使用方法
该方法只需传入一个sort实例。
Constructor Summary
Sort() Sorts by computed relevance. |
Sort(SortField... fields) Sorts in succession by the criteria in each SortField. |
Sort(SortField field) Sorts by the criteria in the given SortField. |
在sort实例中,决定对哪个字段进行排序,按照什么数据类型排序,是升序还是降序,由SortField说的算。
两个最基础的构造方法如下:
SortField(String field, int type) Creates a sort by terms in the given field with the type of term values explicitly given. |
SortField(String field, int type, boolean reverse) Creates a sort, possibly in reverse, by terms in the given field with the type of term values explicitly given. |
通过这些类我们能很方便的完成检索结果的排序。
简单示例:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->SortField sortF = new SortField("f", SortField.INT);
Sort sort = new Sort( sortF);
TopFieldDocs docs = searcher.search(query, null, 10, sort);
//遍历docs中的结果
2.按文档得分进行排序;
IndexSearcher默认的搜索就是按照文档得分进行排序的。
在SortField中将类型设置为SCORE即可。
static int |
SCORE Sort by document score (relevancy). |
3.按文档内部id进行排序;
每个文档进入索引的时候都会分配一个id号,有时可能会需要按照这个id号进行排序,
那么将SortField中类型设置为DOC即可。
static int |
DOC Sort by document number (index order). |
4.数值型、日期型排序注意事项;
假设莫一索引有五个文档,默认排序如下所示:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->Document<stored,indexed<f:10> stored,indexed<f1:20100215> stored,indexed<a:fox>>
Document<stored,indexed<f:10> stored,indexed<f1:20090512> stored,indexed<a:fox>>
Document<stored,indexed<f:5> stored,indexed<f1:20101019> stored,indexed<a:fox>>
Document<stored,indexed<f:-2> stored,indexed<f1:20000128> stored,indexed<a:fox>>
Document<stored,indexed<f:0> stored,indexed<f1:20050719> stored,indexed<a:fox>>
注意蓝色标识出来的字段是一个int型数据,红色标识出来的字段是一个8位的日期数据。默认排序中他是无序的。
使用INT类型对 f 字段进行排序:
结果:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->Document<stored,indexed<f:-2> stored,indexed<f1:20000128> stored,indexed<a:fox>>
Document<stored,indexed<f:0> stored,indexed<f1:20050719> stored,indexed<a:fox>>
Document<stored,indexed<f:5> stored,indexed<f1:20101019> stored,indexed<a:fox>>
Document<stored,indexed<f:10> stored,indexed<f1:20100215> stored,indexed<a:fox>>
Document<stored,indexed<f:10> stored,indexed<f1:20090512> stored,indexed<a:fox>>
符合预期结果。
使用STRING类型对 f 字段进行排序:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->Document<stored,indexed<f:-2> stored,indexed<f1:20000128> stored,indexed<a:fox>>
Document<stored,indexed<f:0> stored,indexed<f1:20050719> stored,indexed<a:fox>>
Document<stored,indexed<f:10> stored,indexed<f1:20100215> stored,indexed<a:fox>>
Document<stored,indexed<f:10> stored,indexed<f1:20090512> stored,indexed<a:fox>>
Document<stored,indexed<f:5> stored,indexed<f1:20101019> stored,indexed<a:fox>>
第五条数据排序发生异常,不符合预期结果。
因此排序时要特别注意类型的选择。
使用INT类型对 f1 字段进行排序:
结果:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->Document<stored,indexed<f:-2> stored,indexed<f1:20000128> stored,indexed<a:fox>>
Document<stored,indexed<f:0> stored,indexed<f1:20050719> stored,indexed<a:fox>>
Document<stored,indexed<f:10> stored,indexed<f1:20090512> stored,indexed<a:fox>>
Document<stored,indexed<f:10> stored,indexed<f1:20100215> stored,indexed<a:fox>>
Document<stored,indexed<f:5> stored,indexed<f1:20101019> stored,indexed<a:fox>>
符合预期结果。
注意点:
对日期、价格等数据排序都要选择合适的排序类型,不单单是满足业务的需要,而且用INT、FLOAT等数值型的排序
比STRING效率要高。
5.多Field排序;
...实例代码:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->SortField sortF = new SortField("f", SortField.INT);
SortField sortF2 = new SortField("f1", SortField.INT);
Sort sort = new Sort(new SortField[]{sortF , sortF2});
TopFieldDocs docs = searcher.search(query, null, 10, sort);
结果:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->Document<stored,indexed<f:-2> stored,indexed<f1:20000128> stored,indexed<a:fox>>
Document<stored,indexed<f:0> stored,indexed<f1:20050719> stored,indexed<a:fox>>
Document<stored,indexed<f:5> stored,indexed<f1:20101019> stored,indexed<a:fox>>
Document<stored,indexed<f:10> stored,indexed<f1:20090512> stored,indexed<a:fox>>
Document<stored,indexed<f:10> stored,indexed<f1:20100215> stored,indexed<a:fox>>
注意点:
先按照 f字段 进行排序,如果 f字段 值相等,再按照 f1字段 进行排序。
这个顺序由 SortField数组中 SortField实例的顺序 一致。
6.通过改变boost值来改变文档的得分。
默认排序(相关度排序),原始排序情况:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->Document<stored,indexed<f:10> stored,indexed<f1:20100215> stored,indexed<a:fox>>
Document<stored,indexed<f:10> stored,indexed<f1:20090512> stored,indexed<a:fox>>
Document<stored,indexed<f:5> stored,indexed<f1:20101019> stored,indexed<a:fox>>
Document<stored,indexed<f:-2> stored,indexed<f1:20000128> stored,indexed<a:fox>>
Document<stored,indexed<f:0> stored,indexed<f1:20050719> stored,indexed<a:fox>>
修改第5个文档的boost值。
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->doc5.setBoost(5);
然后再看看排序情况:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->Document<stored,indexed<f:0> stored,indexed<f1:20050719> stored,indexed<a:fox>>
Document<stored,indexed<f:10> stored,indexed<f1:20100215> stored,indexed<a:fox>>
Document<stored,indexed<f:10> stored,indexed<f1:20090512> stored,indexed<a:fox>>
Document<stored,indexed<f:5> stored,indexed<f1:20101019> stored,indexed<a:fox>>
Document<stored,indexed<f:-2> stored,indexed<f1:20000128> stored,indexed<a:fox>>
可以看到 从地到天 了!
这个功能的商用价值很大,只能这么说...
分享到:
相关推荐
《Lucene3.0原理与代码分析》是针对搜索引擎库Lucene 3.0版本的一份详尽解析,旨在帮助读者深入理解其内部工作机制和实现细节。Lucene是一款高性能、全文检索库,广泛应用于各类信息检索系统。下面将围绕Lucene的...
【Lucene3.0查询类型详解】 在Lucene3.0中,查询处理是一个关键环节,涉及多种查询方式和理论模型。以下是对这些概念的详细解释: 1. **查询方式**: - **顺序查询**:是最简单的查询方式,直接遍历索引,效率较...
《Lucene 3.0 原理与代码分析完整版》是一本深入解析Lucene 3.0搜索引擎库的专业书籍。Lucene是Apache软件基金会的开源项目,它为Java开发者提供了一个高性能、全文检索的工具包,广泛应用于各种信息检索系统。这...
总结,Lucene3.0是Java世界中不可或缺的全文检索工具,它的索引构建、查询处理和结果排序机制为我们提供了高效且灵活的搜索功能。通过深入学习其内部工作原理,结合具体的代码实践,开发者可以更好地利用Lucene3.0...
在本文中,我们将深入探讨Lucene 3.0版本,了解其核心概念、功能特性,并通过实例来展示如何使用这个强大的工具。 ### 1. Lucene 3.0核心概念 #### 1.1 文档与字段 在Lucene中,数据是以文档(Document)的形式...
**Lucene 3.0 入门实例** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它提供了完整的搜索功能,包括索引、查询解析、排序以及高级的文本分析能力。在 Lucene 3.0 版本中,开发者可以利用其强大...
**Lucene 3.0 入门实例及关键知识点** Lucene 是一个开源的全文搜索引擎库,由 Apache 软件基金会开发。它为开发者提供了在应用程序中实现文本搜索功能的强大工具。本实例主要针对 Lucene 3.0 版本,这个版本虽然...
3. **结果排序**: Lucene支持多种评分机制,如TF-IDF(词频-逆文档频率),可以根据评分对搜索结果进行排序。 4. **优化索引**: 可以定期进行索引合并,以减少索引分段数量,提高搜索性能。 **源码分析** 由于...
《深入理解Lucene 3.0:开源全文检索框架解析》 Lucene是一个高性能、可扩展的信息检索库,由Apache软件基金会开发并维护。作为Java编写的核心搜索库,Lucene为开发者提供了强大的文本分析和索引功能,是构建全文...
《Lucene 3.0基础实例详解》 在IT领域,搜索引擎技术是不可或缺的一部分,而Apache Lucene作为一款开源的全文检索库,被广泛应用在各种信息检索系统中。本篇文章将深入探讨Lucene 3.0的基础实例,帮助读者理解和...
《Lucene 3.0 API CHM指南》 Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,广泛应用于各种搜索引擎和信息检索系统。本指南主要关注的是Lucene 3.0版本的API,这是一个强大的工具集,用于在Java环境...
**基于Lucene 3.0的书籍查询系统详解** Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发。在3.0版本中,Lucene提供了强大的文本分析、索引和搜索功能,使得开发者能够快速地构建自己的全文检索应用。本...
4. **评分与排序(Scoring and Sorting)**:Lucene根据相关性对搜索结果进行评分,示例可能会展示如何获取和理解这些分数,以及如何根据其他字段(如日期或自定义评分函数)进行排序。 5. **结果集(Result Set)*...
这个入门实例将引导我们了解如何使用Lucene 3.0版本进行基本的索引和搜索操作。以下是对Lucene 3.0关键知识点的详细讲解: 1. **Lucene的架构**: Lucene的核心组件包括文档(Document)、字段(Field)、索引...
然后通过IndexSearcher对象执行查询,获取匹配的Document结果。 5. **结果展示**:对查询结果进行排序,通常基于相关性评分,然后遍历ScoreDoc,读取每个Document的Field内容,展示给用户。 在提供的压缩包文件中...
#### Apache Lucene 3.0:搜索引擎核心技术解析 **Apache Lucene** 是一个高性能、全功能的文本搜索引擎库,它被广泛应用于构建各种规模的搜索应用。《Lucene in Action》第二版(英文版)是一本深入介绍如何使用 ...
所提供的文档资源,如《Lucene学习总结之一》、《传智播客Lucene3.0课程》、《JAVA_Lucene_in_Action教程完整版》以及《Lucene_in_Action(中文版)》,都是深入了解 Lucene 的宝贵资料,建议结合这些材料进行系统...
7. **近实时搜索(NRT)**:从3.0版本开始,Lucene引入了NRT机制,允许在不完全刷新索引的情况下返回最新结果。`IndexWriter.addDocument()`和`IndexWriter.commit()`等方法体现了这一特性。 8. **多字段搜索**:...
3. **搜索优化**:Lucene 3.0.3的源码中,可以看到对Boosting、Filtering和Sorting等高级搜索功能的实现,以及对TopDocs排序算法的优化。 四、实战应用 了解了Lucene的内部机制后,我们可以根据实际项目需求,结合...