`

[转]lucene3.0_IndexSearcher排序

F# 
阅读更多

IndexSearcher排序

本文主要讲解:

1.IndexSearcher中和排序相关的方法及sort类、SortField类(api级别);

2.按文档得分进行排序;

3.按文档内部id进行排序;

4.数值型、日期型排序注意事项;

5.多Field排序;

6.通过改变boost值来改变文档的得分。

 

----------------------------------------------------------------------

1.IndexSearcher中和排序相关的方法及sort类、SortField类(api级别);

用IndexSearcher直接排序一般使用方法

abstract  TopFieldDocs search(Weight weight, Filter filter, int n, Sort sort) 
          Expert: Low-level search implementation with arbitrary sorting.

该方法只需传入一个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_pdf

    《Lucene3.0原理与代码分析》是针对搜索引擎库Lucene 3.0版本的一份详尽解析,旨在帮助读者深入理解其内部工作机制和实现细节。Lucene是一款高性能、全文检索库,广泛应用于各类信息检索系统。下面将围绕Lucene的...

    Lucene3.0之查询类型详解

    【Lucene3.0查询类型详解】 在Lucene3.0中,查询处理是一个关键环节,涉及多种查询方式和理论模型。以下是对这些概念的详细解释: 1. **查询方式**: - **顺序查询**:是最简单的查询方式,直接遍历索引,效率较...

    Lucene 3.0 原理与代码分析完整版

    《Lucene 3.0 原理与代码分析完整版》是一本深入解析Lucene 3.0搜索引擎库的专业书籍。Lucene是Apache软件基金会的开源项目,它为Java开发者提供了一个高性能、全文检索的工具包,广泛应用于各种信息检索系统。这...

    lucene3.0庖丁+索引搜索程序

    总结,Lucene3.0是Java世界中不可或缺的全文检索工具,它的索引构建、查询处理和结果排序机制为我们提供了高效且灵活的搜索功能。通过深入学习其内部工作原理,结合具体的代码实践,开发者可以更好地利用Lucene3.0...

    lucene3.0使用介绍及实例

    在本文中,我们将深入探讨Lucene 3.0版本,了解其核心概念、功能特性,并通过实例来展示如何使用这个强大的工具。 ### 1. Lucene 3.0核心概念 #### 1.1 文档与字段 在Lucene中,数据是以文档(Document)的形式...

    lucene 3.0 入门实例

    **Lucene 3.0 入门实例** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它提供了完整的搜索功能,包括索引、查询解析、排序以及高级的文本分析能力。在 Lucene 3.0 版本中,开发者可以利用其强大...

    Lucene3.0入门实例含jar包

    **Lucene 3.0 入门实例及关键知识点** Lucene 是一个开源的全文搜索引擎库,由 Apache 软件基金会开发。它为开发者提供了在应用程序中实现文本搜索功能的强大工具。本实例主要针对 Lucene 3.0 版本,这个版本虽然...

    关于全文检索的文章(使用技术Lucene3.0)

    3. **结果排序**: Lucene支持多种评分机制,如TF-IDF(词频-逆文档频率),可以根据评分对搜索结果进行排序。 4. **优化索引**: 可以定期进行索引合并,以减少索引分段数量,提高搜索性能。 **源码分析** 由于...

    lucene3.0

    《深入理解Lucene 3.0:开源全文检索框架解析》 Lucene是一个高性能、可扩展的信息检索库,由Apache软件基金会开发并维护。作为Java编写的核心搜索库,Lucene为开发者提供了强大的文本分析和索引功能,是构建全文...

    lucene3.0基础实例

    《Lucene 3.0基础实例详解》 在IT领域,搜索引擎技术是不可或缺的一部分,而Apache Lucene作为一款开源的全文检索库,被广泛应用在各种信息检索系统中。本篇文章将深入探讨Lucene 3.0的基础实例,帮助读者理解和...

    lucene3.0-api.CHM

    《Lucene 3.0 API CHM指南》 Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,广泛应用于各种搜索引擎和信息检索系统。本指南主要关注的是Lucene 3.0版本的API,这是一个强大的工具集,用于在Java环境...

    基于lucene3.0 书籍查询系统

    **基于Lucene 3.0的书籍查询系统详解** Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发。在3.0版本中,Lucene提供了强大的文本分析、索引和搜索功能,使得开发者能够快速地构建自己的全文检索应用。本...

    lucene 3.0 例子

    4. **评分与排序(Scoring and Sorting)**:Lucene根据相关性对搜索结果进行评分,示例可能会展示如何获取和理解这些分数,以及如何根据其他字段(如日期或自定义评分函数)进行排序。 5. **结果集(Result Set)*...

    Apache Lucene3.0 入门实例介绍

    这个入门实例将引导我们了解如何使用Lucene 3.0版本进行基本的索引和搜索操作。以下是对Lucene 3.0关键知识点的详细讲解: 1. **Lucene的架构**: Lucene的核心组件包括文档(Document)、字段(Field)、索引...

    盘古分词、lucene3.0.3搜索的使用示例.zip

    然后通过IndexSearcher对象执行查询,获取匹配的Document结果。 5. **结果展示**:对查询结果进行排序,通常基于相关性评分,然后遍历ScoreDoc,读取每个Document的Field内容,展示给用户。 在提供的压缩包文件中...

    Lucene in Action 2nd Edition 英文版

    #### Apache Lucene 3.0:搜索引擎核心技术解析 **Apache Lucene** 是一个高性能、全功能的文本搜索引擎库,它被广泛应用于构建各种规模的搜索应用。《Lucene in Action》第二版(英文版)是一本深入介绍如何使用 ...

    lucene 资料全集

    所提供的文档资源,如《Lucene学习总结之一》、《传智播客Lucene3.0课程》、《JAVA_Lucene_in_Action教程完整版》以及《Lucene_in_Action(中文版)》,都是深入了解 Lucene 的宝贵资料,建议结合这些材料进行系统...

    Lucene3.5源码jar包

    7. **近实时搜索(NRT)**:从3.0版本开始,Lucene引入了NRT机制,允许在不完全刷新索引的情况下返回最新结果。`IndexWriter.addDocument()`和`IndexWriter.commit()`等方法体现了这一特性。 8. **多字段搜索**:...

    lucene-3.0.3-src.zip

    3. **搜索优化**:Lucene 3.0.3的源码中,可以看到对Boosting、Filtering和Sorting等高级搜索功能的实现,以及对TopDocs排序算法的优化。 四、实战应用 了解了Lucene的内部机制后,我们可以根据实际项目需求,结合...

Global site tag (gtag.js) - Google Analytics