`
sealbird
  • 浏览: 586384 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

lucene搜索结果排序之Payload

阅读更多
提高特定词汇的评分

利用 Payload 功能,可以提高文档中特定词汇的评分,如黑体词汇、斜体词汇等,从而优化搜索结果排序。

下面还以文档 D0 和 D1 为例说明如何设置和检索 Payload。其中GPRS为专业术语,但search “GPRS描述”的时候,返回的D1的得分比D0高。但这不是我们想要的结果,我们可能想要D0得分高一些,这时可在incrementToken中,自定义词的权重(例如术语权重高些),然后在重写Similarity,自定义score。

D0 = "GPRS的问题"
D1 = "问题描述"
Step1:在 Analyzer 处理过程中,为特殊词汇添加评分 Payload  
ICTCLASTokenizer.java 
/**
     * @see org.apache.lucene.analysis.TokenStream#incrementToken()
     */
    @Override
    public boolean incrementToken() throws IOException {
        clearAttributes();
        
        Word lexeme = segmentation.next();
        if (lexeme == null)
            return false;

        termAttr.setTermBuffer(lexeme.getText());
        offsetAttr.setOffset(lexeme.getStartPosition(), lexeme.getEndPosition());

        /*
         * 有词性,就存进payload
         */
        String payloadText = "";
        if (needPOSTagged && !StringUtils.isEmpty(lexeme.getPartOfSpeech()))
            payloadText = lexeme.getPartOfSpeech();

        /*
         * 该词为指定关键字或者术语,就存进payload
         */
        float keyweight = gmccKeyWordDeal.doDeal(lexeme.getText());
        if(keyweight > 0)
            payloadText = payloadText + "_" + keyweight;
        
        if(!payloadText.equals(""))
            payloadAttr.setPayload(new Payload(payloadText.getBytes()));

        finalOffset = lexeme.getEndPosition();

        return true;
    }
 

Step2:重写 Similarity (主要负责排名和评分)

BwSimilarity.java

public class BwSimilarity extends DefaultSimilarity {

    private static final long serialVersionUID = -8049061435299914513L;

    public BwSimilarity() {
        super();
    }

    @Override
    public float scorePayload(int docId, String fieldName, int start, int end,
            byte[] payload, int offset, int length) {
        
        String payloadStr = "";
        try {
            payloadStr = new String(payload, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return 1;
        }
        
        // 获取设定的keyweight,默认为1
        String kwStr = "1";
        int kwIndex = payloadStr.indexOf("_");
        if(kwIndex != -1)
            kwStr = payloadStr.substring(kwIndex + 1);
        
        return Float.parseFloat(kwStr);
    }

    @Override
    public float coord(int overlap, int maxOverlap) {
        float overlap2 = (float)Math.pow(2, overlap);
        float maxOverlap2 = (float)Math.pow(2, maxOverlap);
        return (overlap2 / maxOverlap2);
    }
    
}


Step3:使用重写的 boostingSimilarity 进行检索

PayloadTermQuery ptq = new PayloadTermQuery(new Term(field, term),new AveragePayloadFunction());

Searcher searcher = new IndexSearcher(…);
Searcher.setSimilarity(boostingSimilarity);
…
ScoreDoc[] hits = searcher.search(ptq , hitsPerPage).scoreDocs;




相关链接:

Lucene Payload 的研究与应用:http://www.ibm.com/developerworks/cn/opensource/os-cn-lucene-pl/index.html
分享到:
评论

相关推荐

    lucene自定义排序实现

    默认情况下,Lucene 搜索结果是按照文档的相关性(即查询评分)进行排序的。这个评分是通过 TF-IDF(词频-逆文档频率)算法计算得出的,它反映了文档中关键词出现的频率以及在整个文集中的稀有程度。 然而,有些...

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

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

    lucene排序、设置权重、优化、分布式搜索.pdf

    Lucene 的排序是指根据某个字段的值对搜索结果进行排序。 Lucene 提供了多种排序方式,包括升序和降序排序。可以使用 Sort 对象来指定排序字段和排序方式。 例如,下面的代码演示如何使用 Lucene 对搜索结果进行...

    Lucene5学习之自定义排序

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

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

    - **高亮显示**:Lucene支持高亮搜索关键词,将匹配的关键词在搜索结果中突出显示,使用户更容易找到相关信息。 3. 分页: - 分页通常通过设置页码和每页记录数来实现。在查询时,通过偏移量(offset)和记录数...

    lucene排序.zip

    它提供了强大的文本分析、索引和搜索功能,而排序作为搜索结果的重要组成部分,是Lucene的一个核心特性。本文将深入探讨Lucene如何根据关键词出现次数进行排序,以及如何实现自定义排序,包括处理`List<Map>`字段的...

    Lucene0之结果排序.pdf

    Lucene 是一个流行的全文搜索引擎库,其结果排序是通过复杂的算法来实现的,旨在提供最相关的搜索结果。这一过程基于信息检索系统的“相关排序”概念,即根据文档与查询之间的相关性来排列搜索结果。 **向量空间...

    lucene4.3 按坐标距离排序

    在IT领域,Lucene是一个非常著名的全文搜索引擎库,由Apache软件基金会开发。...通过对地理位置数据的有效处理和排序,开发者能够为用户提供更精确、更具相关性的搜索结果,从而提升应用的整体价值。

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

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

    Lucene5学习之排序-Sort

    “Lucene5学习之排序-Sort”这个标题表明了我们要探讨的是关于Apache Lucene 5版本中的排序功能。Lucene是一个高性能、全文检索库,它提供了强大的文本搜索能力。在这个主题中,我们将深入理解如何在Lucene 5中对...

    SpringBoot+Lucene搜索结果高亮显示Demo

    **SpringBoot+Lucene搜索结果高亮显示** 在现代Web应用程序中,强大的全文搜索引擎功能是不可或缺的,而Apache Lucene正是这样一个高效的、可扩展的开源全文检索库。在这个SpringBoot+Lucene的Demo中,我们将深入...

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

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

    lucene的排序过滤和分页.zip

    排序是Lucene中的一项核心功能,允许我们根据文档的某个或多个字段来对搜索结果进行定制化排序。Lucene支持两种类型的排序:基于评分(Score Sorting)和基于字段(Field Sorting)。基于评分的排序默认按照相关性...

    Lucene搜索引擎 JSP + JAVA

    在Lucene搜索引擎中,Java用于处理后台逻辑,如构建索引、执行搜索查询以及处理搜索结果。Java类负责与Lucene API交互,实现索引的创建、更新和读取,以及执行复杂查询。 **4. 搜索引擎实现** - **索引构建**: 使用...

    Lucene搜索引擎开发权威经典(附盘源码)【于天恩】.zip

    《Lucene搜索引擎开发权威经典》是由于天恩编著的一本深入探讨Lucene搜索引擎开发的专业书籍,这本书结合源码分析,旨在帮助读者掌握Lucene的核心技术和应用实践。Lucene是Apache软件基金会的一个开放源代码项目,它...

    LUCENE搜索引擎基本工作原理

    总结来说,Lucene搜索引擎的基本工作原理包括建立倒排索引、处理用户查询以及返回相关性最高的结果。同时,Lucene还支持与目录索引的集成,适应各种搜索场景。通过理解这些原理,开发者可以更好地利用Lucene构建高效...

    lucene搜索引擎项目

    5. **搜索结果相关性** Lucene通过TF-IDF(Term Frequency-Inverse Document Frequency)算法计算文档的相关性。TF-IDF评估一个词项在文档中的重要性,从而帮助确定哪些文档更相关。 6. **扩展与应用** 虽然...

    lucene站内搜索

    5. **结果排序(Resuliting Sorting)**: 按照评分从高到低排序搜索结果,返回给用户。 ### 三、使用Lucene进行站内搜索 1. **集成Lucene**: 在项目中引入Lucene库,创建索引目录,并实例化IndexWriter用于写入...

Global site tag (gtag.js) - Google Analytics