如欲转载,请注明作者:caocao,来源http://caocao.iteye.com/。
Lucene的搜索结果默认按相关度排序,这个相关度排序是基于内部的Score和DocID,Score又基于关键词的内部评分和做索引时的boost。默认Score高的排前面,如果Score一样,再按索引顺序,先索引的排前面。那么有人问了,如果我要先索引的排后面怎么办呢?隐士研究了源码后发现这是相当简单的事情。以下代码基于Lucene 2.0。
看Sort的默认构造函数,相关度就是SortField.FIELD_SCORE和SortField.FIELD_DOC的组合。
java 代码
/**
* Sorts by computed relevance. This is the same sort criteria as calling
* {@link Searcher#search(Query) Searcher#search()}without a sort criteria,
* only with slightly more overhead.
*/
public Sort() {
this(new SortField[] { SortField.FIELD_SCORE, SortField.FIELD_DOC });
}
那么该如何构造我们需要的SortField呢?请看SortField的一个构造函数,有一个参数reverse可供我们调整结果集的顺序。
java 代码
/** Creates a sort, possibly in reverse, by terms in the given field with the
* type of term values explicitly given.
* @param field Name of field to sort by. Can be <code>null</code> if
* <code>type</code> is SCORE or DOC.
* @param type Type of values in the terms.
* @param reverse True if natural order should be reversed.
*/
public SortField (String field, int type, boolean reverse) {
this.field = (field != null) ? field.intern() : field;
this.type = type;
this.reverse = reverse;
}
由此可见,只要构造一个SortField[]就可以实现我们要的功能,请看:
java 代码
// 评分降序,评分一样时后索引的排前面
new SortField[] { SortField.FIELD_SCORE, new SortField(null, SortField.DOC, true) }
// 评分升序,评分一样时后索引的排前面,呵呵,此为最不相关的排前面,挺有趣的
new SortField[] { new SortField(null, SortField.SCORE, true), new SortField(null, SortField.DOC, true) }
呵呵,只要将此SortField[]作为参数传入Sort的构造函数得到Sort的一个instance,将此instance传入searcher.search(query, sort)即可得到了期望的结果。
具体实例可参考隐士做的搜索站http://so.mdbchina.com。
分享到:
相关推荐
因此,了解如何在 Lucene 中实现自定义排序是非常关键的。在这个话题中,我们将深入探讨如何根据特定的业务需求对搜索结果进行定制排序。 首先,我们要明白 Lucene 默认的排序机制。默认情况下,Lucene 搜索结果是...
在实际应用中,Filter还可以与其他组件结合使用,如Sort(排序)和Highlight(高亮),以提供更丰富的搜索体验。例如,我们可以先使用Filter筛选出满足条件的文档,再根据某个字段进行排序,最后对高亮显示匹配的...
“Lucene5学习之排序-Sort”这个标题表明了我们要探讨的是关于Apache Lucene 5版本中的排序功能。Lucene是一个高性能、全文检索库,它提供了强大的文本搜索能力。在这个主题中,我们将深入理解如何在Lucene 5中对...
Lucene中的自定义排序功能和Java集合中的自定义排序的实现方法差不多,都要实现一下比较接口. 在Java中只要实现Comparable接口就可以了.但是在Lucene中要实现SortComparatorSource接口和ScoreDocComparator接口.在...
自定义排序在Lucene中主要通过`Sort`类来实现。`Sort`对象允许我们指定一系列的排序规则,这些规则可以是基于文档字段的值,也可以是基于相关度得分。我们可以通过创建`SortField`对象来指定排序依据的字段和排序...
- 结果排序的示例,可能包含如何自定义`Sort`对象以改变默认的排序方式。 通过这些Demo,你可以逐步理解Lucene的工作原理,学习如何在实际项目中集成和优化搜索功能。此外,3.3.0版本可能还涉及一些当时的特性,...
在`IndexSearcher`中,可以通过设置`Sort`对象来应用自定义的比较器,以改变默认的评分排序。 最后,`MySortComparatorSource.java`涉及到了Lucene的排序机制。在Lucene中,`Sort`类用于控制搜索结果的排序方式,而...
除了基本的搜索外,Lucene还支持过滤器(Filter)和排序(Sort)功能。过滤器可以快速筛选满足特定条件的文档,而排序则允许用户自定义搜索结果的排列顺序。 8. **更新与删除** Lucene允许动态更新和删除文档,...
《深入理解Lucene排序机制:从关键词频率到自定义优先级》 在信息检索领域,Lucene是一个广泛使用的全文搜索引擎库。它提供了强大的文本分析、索引和搜索功能,而排序作为搜索结果的重要组成部分,是Lucene的一个...
Lucene支持基于文档字段的排序,这可以通过`Sort`类实现。默认的排序依据是文档的相关性分数(由`Similarity`和`TF-IDF`算法计算得出)。用户还可以自定义评分函数以适应特定的业务场景。 6. **近实时搜索** 通过...
10. **扩展与自定义**:Lucene允许开发者根据需求扩展其功能,如自定义`Similarity`类以改变评分算法,或实现新的`TokenStream`以支持特殊格式的文本。 通过对这些源码的学习,开发者不仅能掌握Lucene的基本用法,...
5. **过滤与排序**:除了返回最相关的搜索结果,我们还需要对结果进行过滤(例如,按日期或评分排序),这可以通过Filter和Sort类来实现。 6. ** faceted search(面式搜索)**:在大型信息集合中,提供分类浏览和...
8. **自定义排序和分页**:在分组查询中,我们还可以定义每个组内文档的排序方式,以及在每个组中返回多少结果,这可以通过`Sort`对象来实现。 9. **实时更新**:如果索引是实时更新的,我们需要确保分组查询能够...
同时,Sort类则支持对结果进行定制化的排序,包括基于评分、字段值或自定义比较器的排序。 4. **高亮显示**: Lucene 提供了Highlighter组件,可以在搜索结果中高亮显示匹配的关键词,提升用户体验。4.6.1版文档会...
用户还可以自定义Analyzer以适应特定的需求,例如去除停用词(如“the”、“is”等常见词)。 三、禁词过滤 在去词过程中,有时需要排除某些无意义或者不重要的词汇,这被称为禁词过滤。禁词过滤器(StopFilter)...
5. **分页和排序**:使用TopDocs和Sort对象,可以实现搜索结果的分页和自定义排序。 6. **实时更新**:通过NRT(Near Real Time)模式,Lucene能够在短时间内对索引进行更新并反映到搜索结果中。 **四、Lucene与...
3. **排序(Sort)**:Lucene默认按照文档的得分进行排序,但也可以使用`Sort`工具自定义排序规则。例如,你可以设置`SortField`来指定一个或多个字段进行排序,如`SortField(int, SortField.Type, boolean ...
Lucene 支持基于评分(Score)、文档ID或自定义字段的排序。使用 `Sort` 类定义排序规则,并在执行查询时传递给 `IndexSearcher`。 5. **性能优化** - **批量索引**:一次处理大量文档比逐个添加更高效。 - **...