`
caocao
  • 浏览: 272011 次
  • 来自: 上海
社区版块
存档分类
最新评论

Lucene相关度排序的调整

    博客分类:
  • Java
阅读更多

如欲转载,请注明作者:caocao,来源http://caocao.iteye.com/

Lucene的搜索结果默认按相关度排序,这个相关度排序是基于内部的Score和DocID,Score又基于关键词的内部评分和做索引时的boost。默认Score高的排前面,如果Score一样,再按索引顺序,先索引的排前面。那么有人问了,如果我要先索引的排后面怎么办呢?隐士研究了源码后发现这是相当简单的事情。以下代码基于Lucene 2.0。

看Sort的默认构造函数,相关度就是SortField.FIELD_SCORE和SortField.FIELD_DOC的组合。

java 代码
  1. /**  
  2.  * Sorts by computed relevance. This is the same sort criteria as calling  
  3.  * {@link Searcher#search(Query) Searcher#search()}without a sort criteria,  
  4.  * only with slightly more overhead.  
  5.  */  
  6. public Sort() {   
  7.   this(new SortField[] { SortField.FIELD_SCORE, SortField.FIELD_DOC });   
  8. }  

那么该如何构造我们需要的SortField呢?请看SortField的一个构造函数,有一个参数reverse可供我们调整结果集的顺序。

java 代码
  1. /** Creates a sort, possibly in reverse, by terms in the given field with the  
  2.    * type of term values explicitly given.  
  3.    * @param field  Name of field to sort by.  Can be <code>null</code> if  
  4.    *               <code>type</code> is SCORE or DOC.  
  5.    * @param type   Type of values in the terms.  
  6.    * @param reverse True if natural order should be reversed.  
  7.    */  
  8.   public SortField (String field, int type, boolean reverse) {   
  9.     this.field = (field != null) ? field.intern() : field;   
  10.     this.type = type;   
  11.     this.reverse = reverse;   
  12.   }  

由此可见,只要构造一个SortField[]就可以实现我们要的功能,请看:

java 代码
  1. // 评分降序,评分一样时后索引的排前面   
  2. new SortField[] { SortField.FIELD_SCORE, new SortField(null, SortField.DOC, true) }   
  3.   
  4. // 评分升序,评分一样时后索引的排前面,呵呵,此为最不相关的排前面,挺有趣的   
  5. 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

分享到:
评论
2 楼 NetBus 2007-03-17  
lucene搜索如果不按docid或者score sort的话,那将会是非常慢的。代码不管你怎么优化、索引库不管你如何建都是徒劳的。

我曾经使用过lucene搭建搜索平台,当记录达到50万以上,索引库达到2G以上时,lucene的搜索、优化索引等效率就非常底了(P3 500Mhz CPU、1G Ram),并且不可接受。
1 楼 YuLimin 2007-02-15  
单个排序时,直接用setSort更方便

  /**
   * Sets the sort to the terms in <code>field</code> possibly in reverse,
   * then by index order (document number).
   */
  public void setSort(String field, boolean reverse)

相关推荐

    深入了解Lucene之三 排序算法.doc

    Lucene 排序算法是搜索引擎中的核心组件之一,负责将搜索结果按照相关度排序以便用户快速找到所需信息。 Lucene 的排序算法主要基于 tf-idf 模型,以下是 Lucene 排序算法的详细介绍: 1. tf(Term Frequency):...

    Lucene5学习之自定义排序

    首先,Lucene的核心功能之一就是提供高效的全文检索能力,但默认的搜索结果排序通常是基于相关度得分(Relevance Score),这是由TF-IDF算法计算得出的。然而,在实际应用中,我们往往需要根据其他因素(如时间、...

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--data

    - **排序**:通过调整查询参数,可以基于文档的相关度、发布日期或其他自定义字段对结果进行排序。 - **分页**:为了提高用户体验,搜索引擎通常会限制每次返回的结果数量,实现分页展示,如每页10条记录。 - **...

    luceneDemo(完整代码)

    "luceneDemo(完整代码)"是一个实践项目,旨在帮助开发者深入理解Lucene的基础类运用、高亮器实现以及相关度排序等核心概念。 首先,我们来看看基础类的运用。在Lucene中,IndexWriter是创建和更新索引的主要类,...

    Lucene4.X实战类baidu搜索的大型文档海量搜索系统-18.Lucene排序 共6页.pptx

    首先,Lucene的默认排序方式是基于文档得分,即通过TF-IDF(词频-逆文档频率)算法来评估文档与查询的相关度。TF(t in d)表示词条t在文档d中的出现次数,IDF(t)衡量的是词条t在整个文档集合中的稀有程度。同时,...

    搜索引擎开发现实文档(lucene)

    2. 相关度排序:Lucene 使用相关度排序公式对搜索结果进行排序。 3. VSM 和 BM25:VSM(Vector Space Model)和 BM25 是两种常用的相关度排序算法。 4. Lucene 优化:Lucene 优化是指对 Lucene 的配置和参数进行调整...

    基于Lucene的医疗搜索引擎排序算法的研究.rar

    因此,可能需要结合医学知识图谱,引入相关度更高的排序因子,如疾病的相关性、症状的严重程度等。此外,还可以考虑时间因素,将最新的研究成果优先展示。 再者,个性化搜索也是优化的关键点。用户的行为、地理位置...

    lucene-4.7.0.zip

    Lucene是一个开源的Java库,其核心功能包括文档索引、搜索、排序以及相关的文本分析工具。它的主要任务是创建索引,将非结构化的文本数据转换成可以快速查询的结构化形式。Lucene支持多种数据源,如文件系统、数据库...

    Lucene.net学习帮助文档

    除了基本的搜索功能,Lucene.net还提供了如高亮显示搜索结果、地理位置搜索、评分排序等功能。开发者可以根据需求通过扩展Lucene.net的功能来满足特定场景的应用。 **七、实战案例** 学习文档中可能包含了一些实际...

    lucene实现全文搜索

    全文检索与数据库中的LIKE关键字查询不同,LIKE虽然能进行模糊匹配,但其结果可能不准确,没有相关度排序,且效率较低。 【Lucene简介】 Lucene是一个由Java编写的高性能、可扩展的全文搜索引擎库。它提供了一种...

    非常详细的Lucene文档

    2. **排序与评分(Sorting & Scoring)**: Lucene 支持基于相关性的排序,通过 TF-IDF(Term Frequency-Inverse Document Frequency)等算法计算文档的相关度。 3. **多字段搜索(Multi-Field Searching)**: 用户...

    lucene的封装和性能优化

    同时,可以提供方法来计算相关度、过滤重复结果等。 ### 3. Lucene性能优化 #### 3.1 分片与分布式 在大数据量场景下,可以采用分片策略,将索引分散到多个节点上,利用Lucene的分布式搜索能力,提高查询效率。 ...

    lucene 权重设置

    7. **搜索相关度评分(Score)**:Lucene为每个匹配查询的文档计算一个分数,表示其与查询的相似度。分数的计算涉及多个因素,包括词频(tf)、逆文档频率(idf)、激励因子(boost)和长度规范(lengthNorm)。高...

    lucene检索文档、检索大数据量数据

    Lucene允许根据多种因素对搜索结果进行排序,如相关度、时间戳等。此外,用户可以通过点击反馈调整搜索结果,Lucene支持对这些反馈信息进行学习,以改进未来的查询结果。 综上所述,Lucene是处理大数据量文本检索的...

    一步一步跟我学习lucene(12)---lucene搜索之分组处理group查询

    6. **优化性能**:为了提高性能,Lucene提供了`SecondPassGroupingCollector`,它允许在第二轮搜索中仅检索每个组的最相关文档,而不是所有文档。这对于大型数据集特别有用,因为它减少了I/O操作。 7. **注意内存...

    lucene-4.0.0

    `TopDocs` 结果包含了匹配文档的评分和排序信息,`ScoreDoc` 描述了每个匹配文档的相关度。 6. **评分与相关性**:Lucene 4.0.0 引入了 BM25 相关性算法,这是一种改进的 TF-IDF 模型,能够更好地处理文档长度不...

    基于Lucene的Web站内信息搜索系统

    - **评分(Scoring)**:Lucene根据查询与文档的相关度计算得分,用于排序搜索结果。 2. **Web集成**: - **Servlet/Filter**:在Web应用中,可以使用Servlet或Filter来接收用户请求,调用Lucene进行查询,然后...

    lucene开发资料.zip

    Lucene的搜索结果排序基于相关度评分,该评分基于查询项在文档中的出现频率、位置等因素。提供的代码示例可以帮助理解如何进行搜索操作和处理结果。 此外,公用类和配置文件是实际开发中不可或缺的部分。公用类通常...

Global site tag (gtag.js) - Google Analytics