`
suichangkele
  • 浏览: 202197 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

lucene3.0.3中的PayloadTermQuery、PayloadFunction

阅读更多

上一篇写了SpanTermQuery,他没有任何意思,但是他有个子类,叫做PayloadTermQuery,这个类倒是可以实现一些功能。他也是根据term进行召回,但是对于得分的计算可以加入payload的信息,这样可以使得某个term和某个doc产生单独的关系,比如我们在电商搜索中,对于某个商品想做推广,使得他在搜索a词的时候得分特别大,但是其他的搜索的得分不会变大,显然使用boost是不正确的,因为他会使得所有的词的搜索得分都会变大。这个时候就可以使用payload了,这个类和SpanTermQuery的不同之处在于得分上,我们看一下这个类的得分的实现,在PayloadTermQuery最终生成的PayloadTermSpanScorer中,在调用nextDoc的时候会调用setFreqCurrentDoc方法,即计算当前doc的所有的位置的得分,源码如下:

/**
 * 根据term在doc中的每一次出现计算得分,计算当前doc的freq值,相比spanTermQuery他的区别是添加了payload的处理
 */
@Override
protected boolean setFreqCurrentDoc() throws IOException {
	if (!more) {
		return false;
	}
	doc = spans.doc();
	freq = 0.0f;
	payloadScore = 0;
	payloadsSeen = 0;
	Similarity similarity1 = getSimilarity();
	while (more && doc == spans.doc()) {
		int matchLength = spans.end() - spans.start();
		freq += similarity1.sloppyFreq(matchLength);//计算出现频率的得分
		processPayload(similarity1);//计算payload的得分,比TermSpanQuery就是多了这个方法
		more = spans.next();// this moves positions to the next match in this document
	}
	return more || (freq != 0);
}

 最关键的就是多了一个processPayload的方法,他会读取当前位置的payload信息,然后根据payload计算一个得分,我们看一下这个方法的源码:

protected void processPayload(Similarity similarity) throws IOException {
	if (positions.isPayloadAvailable()) {
		payload = positions.getPayload(payload, 0);//读取payload
		payloadScore = function.currentScore(doc, term.field(), spans.start(), spans.end(), payloadsSeen,
				payloadScore, similarity.scorePayload(doc, term.field(), spans.start(), spans.end(),
						payload, 0, positions.getPayloadLength()));//计算payload
		payloadsSeen++;
	} else {
		// zero out the payload?
	}
}

 对于payload的计算会先根据similarity的scorePayload进行得分,默认的Similarity是直接返回1所以我们必须修改这个方法才可以,在计算完这个值之后还要调用一个function.currentScore方法,funtion是穿入的一个属性,用来计算当前的doc上所有的payload的得分,这个方法包括很多的参数,比如payloadSeen(当前的payload是第几个),paylaodScore(没有处理当前的payload时的得分),当前的得分。可以发现他是综合考量了所有的出现位置后计算的得分,但是这个得分并不是最终的得分,最终的得分是在score方法计算的。

@Override
public float score() throws IOException {
	return includeSpanScore ? getSpanScore() * getPayloadScore() : getPayloadScore();
}

 这里涉及到一个includeSpanScore,也就是不包括paylaod的得分(也就是和SpanTermQuery一样的得分),如果包括就两者相乘,不然就只计算PayLoad的得分,getPayloadScore的公式为:

protected float getPayloadScore() {
	return function.docScore(doc, term.field(), payloadsSeen, payloadScore);
}

 可以发现他是对之前计算的payloadScore又进行了一次计算,才算是最终的payload的得分。

 

通过上面的分析就能根据payload进行最终的得分的计算了,剩下的就是看PayloadFunction具体的实现了。

 

PayloadFunction是个抽象类,他有两个重要的方法,一个是 public abstract float currentScore(int docId, String field, int start, int end, int numPayloadsSeen, float currentScore, float currentPayloadScore);用来计算当前位置的payload的得分,一个是public abstract float docScore(int docId, String field, int numPayloadsSeen, float payloadScore);用于计算当前doc的所有的payLoad的得分,我们看一下他的具体实现类。

 

1、AveragePayloadFunction:对所有位置的payload的得分去平均数。

  @Override
  public float currentScore(int docId, String field, int start, int end, int numPayloadsSeen, float currentScore, float currentPayloadScore) {
    return currentPayloadScore + currentScore;//将当前的位置的得分和之前的得分加起来,也就是计算所有位置的paylaod的和
  }

  @Override
  public float docScore(int docId, String field, int numPayloadsSeen, float payloadScore) {
    return numPayloadsSeen > 0 ? (payloadScore / numPayloadsSeen) : 1;//将和除以次数,计算平均分。
  }

 

2、MaxPayloadFunction:对所有位置的payload取最大值

@Override
public float currentScore(int docId, String field, int start, int end, int numPayloadsSeen, float currentScore,	float currentPayloadScore) {
	if (numPayloadsSeen == 0) {
			return currentPayloadScore;//第一次返回当前值
	} else {
		return Math.max(currentPayloadScore, currentScore);//返回所有的最大值
	}
}

@Override
public float docScore(int docId, String field, int numPayloadsSeen, float payloadScore) {
	return numPayloadsSeen > 0 ? payloadScore : 1;//返回最大值
}

 

3、MinPayloadFunction:对所有位置的payload取最小值

  @Override
  public float currentScore(int docId, String field, int start, int end, int numPayloadsSeen, float currentScore, float currentPayloadScore) {
    if (numPayloadsSeen == 0) {
      return currentPayloadScore;
    } else {
      return Math.min(currentPayloadScore, currentScore);
    }
  }

  @Override
  public float docScore(int docId, String field, int numPayloadsSeen, float payloadScore) {
    return numPayloadsSeen > 0 ? payloadScore : 1;
  }

 

当然我们也可以自己实现function。payload的功能写到这就算是完了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    lucene-3.0.3-src.zip

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

    lucene3.0.3搜索的使用示例

    这个"lucene3.0.3搜索的使用示例"压缩包文件很可能是为了帮助用户理解并学习如何在项目中应用Lucene 3.0.3版本的功能。 在Lucene 3.0.3中,主要包含了以下核心概念和知识点: 1. **索引(Indexing)**:这是Lucene...

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

    《盘古分词与Lucene 3.0.3在.NET 4.0中的应用实践》 盘古分词和Lucene是两个在文本处理和信息检索领域中至关重要的工具。盘古分词,作为一款优秀的中文分词系统,能够高效准确地对中文文本进行分词,为后续的数据...

    Lucene3.0.3+盘古分词 资源汇总

    《Lucene3.0.3与盘古分词:打造高效搜索引擎》 在信息技术日新月异的时代,搜索引擎已经成为我们获取信息的重要工具。Lucene,作为Apache软件基金会的一个开源项目,是Java语言实现的全文检索引擎库,为开发者提供...

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

    《盘古分词与Lucene 3.0.3在.NET 4.0中的应用实践》 盘古分词和Lucene是两个在中文信息处理领域广泛应用的工具,本示例将详细介绍如何在.NET 4.0环境中整合这两个组件,以实现高效的全文搜索功能,并新增了分页功能...

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

    《盘古分词与Lucene 3.0.3在.NET 4.0中的应用实践》 盘古分词和Lucene是两个在文本处理和全文检索领域中至关重要的工具。本文将深入探讨如何在.NET 4.0环境中集成并使用这两个组件,以实现高效的文本分析和搜索引擎...

    Lucene3.0.3+盘古分词(证实可用,可指定使用自己的词库文件).rar

    在“Lucene3.0.3+盘古分词(证实可用,可指定使用自己的词库文件).rar”这个压缩包中,包含了实现这一功能所需的DLL文件和词库文件,这使得开发者可以轻松地在自己的项目中集成这一功能。 首先,我们要明白Lucene ...

    lucene 3.0.3.core.jar

    lucene3.0.3.core.jar文件,不用到apache官方网站下载17M的包,直接下载这个core就可以了。

    Lucene 3.0.3 API

    在 Lucene 3.0.3 版本中,我们看到了一系列重要的特性和改进,这些都极大地提升了其性能和易用性。 1. **索引过程**:Lucene 的索引过程涉及到将文档内容转换为倒排索引,这是一种高效的存储和检索方式。在 3.0.3 ...

    Lucene3.0分词系统.doc

    以下是对Lucene3.0分词系统中涉及的关键知识点的深入解析。 ### 英文分词原理 英文分词相较于中文来说较为简单,因为英文单词间通常以空格作为天然的分隔符。然而,为了提高搜索效率和准确性,Lucene3.0采用了更...

    lucene-3.0.3.zip

    《Apache Lucene 3.0.3:全文检索与搜索引擎核心技术详解》 Apache Lucene 是一个开源的全文检索库,由Java编写,提供强大的搜索功能。在这个3.0.3版本中,它继续展现了其在信息检索领域的强大性能和灵活性。Lucene...

    Lucene.NET v3.0.3 DEMO范例程序(含PanGu分词)

    这是Lucene.NET v3.0.3 DEMO范例程序(含PanGu分词),用C#语言编写的,同时对PanGu分词进行了整合,可以直接下载运行。 项目中还整理了一个后台任务线程监听范例,可以用作增量索引创建,但这个需要你自行加入相关...

    Lucene.net3.0.3源码

    Apache Lucene.Net 3.0.3 just passed a vote for release - our first official release since graduating from the incubator in August. A lot of work was put into porting and testing the code. We've ...

    Lucene SpellChecker3.0.2

    Lucene SpellChecker for Lucene 3.0.2

    lucene-smartcn-3.0.3.jar

    lucene-smartcn-3.0.3.jar

    Lucene实战(中文版第二版)对应Lucene版本

    此资源对应的是Lucene 3.0.3版本,这是Lucene发展历史中的一个重要里程碑。 在Lucene 3.0.3版本中,包含了以下关键知识点: 1. **索引构建**:Lucene的核心功能之一就是快速构建倒排索引。这个版本中,你可以学习...

    Apache-Lucene.Net-3.0.3-RC2

    Lucene.Net 3.0 最新源码 Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。开发人员可以基于...

    lucene源码和教程

    lucene3.0.3源码和教程

Global site tag (gtag.js) - Google Analytics