`
BuN_Ny
  • 浏览: 87483 次
  • 来自: 济南
社区版块
存档分类
最新评论

11) 第二章 索引:文档优先策略(Boosting)

阅读更多

    请先确认一句话:“并非人人生而平等!”。对于Document和Field也是如此。

    假设你现在需要索引一些邮件。要求是,搜索结果中,船长发出的邮件要排在船员的前面!如何实现?

    还好Lucene为你提供了它的实现,而且非常简单:boosting. 每个文档都拥有一个优先权重因数,默认情况下它的值是1.0, 你可以通过改变此值来实现上面的要求。重要的文档(此例中为船长的邮件),我们可以让这个数大于1.0, 比如2.0如何?次要的文档(此例中为船员的邮件),我们可以让这个数小于1.0, 比如0.5。 当然,也可以让重要的为3.0,次要的为2.0,怎么设计随你。

    那么怎么改变这个因数呢? Lucene API提供了一个独立的方法:setBoost(float); 就是这么简单!

 

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import junit.framework.TestCase;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;

public class IndexBoostingTest extends TestCase{
	
	private Directory directory;
	
	protected void setUp() throws Exception {
		directory = new RAMDirectory();
		IndexWriter writer = getWriter(); 
		
		List<Email> mails = makeSomeEmails();
		for(Email e : mails){
			Document doc = new Document();
			doc.add(new Field("senderEmail", e.getSenderEmail(),
					Field.Store.YES,
					Field.Index.NOT_ANALYZED));
			doc.add(new Field("senderName", e.getSenderName(),
					Field.Store.YES,
					Field.Index.ANALYZED));
			doc.add(new Field("subject", e.getSubject(),
					Field.Store.YES,
					Field.Index.ANALYZED));
			doc.add(new Field("body", e.getBody(),
					Field.Store.NO,
					Field.Index.ANALYZED));
			
			// 关键代码:设置文档的优先权重因数
			if(Email.IMPORTANT.equals(e.getSenderDomain())){
				doc.setBoost(1.5F);
			}else if(Email.UNIMPORTANT.equals(e.getSenderDomain())){
				doc.setBoost(0.5F);
			}else{
				//此处写不写都一样,默认的优先权重因数是1.0
				doc.setBoost(1F);
			}
			writer.addDocument(doc);
		}
		writer.close();
	}
	
	//事实上不能这么写测试用例,因为这种测试很不严格。
    //排序的结果除了受boost影响还取决于文档与查询词的匹配度等
	public void testBoostResult() throws IOException {
		IndexSearcher is = new IndexSearcher(directory); 
		Query query = new TermQuery(new Term("body", "团")); 

        TopDocs topDocs = is.search(query, 3);
        ScoreDoc[] docs = topDocs.scoreDocs;
        
        //我们期望的排序结果是:Luffy、Sanji、Zoro
        String luffy = is.doc(docs[0].doc).get("senderName");
        String sanji = is.doc(docs[1].doc).get("senderName");
        String zoro = is.doc(docs[2].doc).get("senderName");
        
        assertEquals("Luffy", luffy);  //路飞排第一啦~~他的boost是1.5
        assertEquals("Sanji", sanji);  //香吉士采用了默认的boost是1.0
        assertEquals("Zoro", zoro);    //容易迷路的家伙boost是0.5
	}
	
	
	private IndexWriter getWriter() throws IOException { 
		return new IndexWriter(directory, new StandardAnalyzer(Version.LUCENE_30),
				IndexWriter.MaxFieldLength.UNLIMITED);
	}
	
	//模拟测试数据
	private List<Email> makeSomeEmails(){
		
		ArrayList<Email> testData = new ArrayList<Email>();
		
		//测试数据1 不设置boost
		Email mail1 = new Email();
		mail1.setSenderEmail("Sanji@iteye.com");
		mail1.setSenderName("Sanji");
		mail1.setSenderDomain("普通的~~");
		mail1.setSubject("海贼");
		mail1.setBody("草帽海贼团厨师,金发,有着卷曲眉毛,永远遮住半边脸的家伙,其左眼是个迷,香烟不离口,海贼中的绅士");
		testData.add(mail1);
		
		//测试数据2 设置较高的boost
		Email mail2 = new Email();
		mail2.setSenderEmail("Monkey·D·Luffy@iteye.com");
		mail2.setSenderName("Luffy");
		mail2.setSenderDomain(Email.IMPORTANT);
		mail2.setSubject("海贼");
		mail2.setBody("草帽海贼团船长,特征是头戴草帽,顽强,坚定,喜欢探险,最爱吃肉");
		testData.add(mail2);
		
		//测试数据3 设置较低的boost(喜欢索隆的别喷我,我也喜欢...举个例子而已)
		Email mail3 = new Email();
		mail3.setSenderEmail("RoronoaZoro@iteye.com");
		mail3.setSenderName("Zoro");
		mail3.setSenderDomain(Email.UNIMPORTANT);
		mail3.setSubject("海贼");
		mail3.setBody("草帽海贼团剑士,绿色头发,左耳戴三只黄色露珠耳环");
		testData.add(mail3);
		
		return testData;
	}
	
}

class Email{
	
	public static String IMPORTANT = "important";
	public static String UNIMPORTANT = "unimportant";
	
	private String senderEmail;
	private String senderName;
	private String senderDomain;
	private String subject;
	private String body;
	
	public String getSenderEmail() {
		return senderEmail;
	}
	public void setSenderEmail(String senderEmail) {
		this.senderEmail = senderEmail;
	}
	public String getSenderName() {
		return senderName;
	}
	public void setSenderName(String senderName) {
		this.senderName = senderName;
	}
	public String getSenderDomain() {
		return senderDomain;
	}
	public void setSenderDomain(String senderDomain) {
		this.senderDomain = senderDomain;
	}
	public String getSubject() {
		return subject;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	public String getBody() {
		return body;
	}
	public void setBody(String body) {
		this.body = body;
	}
	
}

     问题又来了,如果我们认为邮件的标题中出现的关键词比正文中更重要呢?也就是说要使名为"subject"的Field优先于"body"的。

    哈哈,其实也很简单,只要针对这个域调用 setBoost(float); 即可:

 

Field subjectField = new Field("subject", subject,
                     Field.Store.YES,
                     Field.Index.ANALYZED);
subjectField.setBoost(1.2F);

    事实上,之前的例子中对document设置boost值,相当于对该document下的所有Field设置了相同的boost值。理所当然,你也可以为单个Field设置boost值!

 

    必须要指出,如果需要更改已经设置的boost值,那么只能重新索引整个document,然后为它设置另一个boost值。这看起来很糟糕,毕竟客户的需求总是在变化的。放心,我们还可以通过在搜索阶段自定义排序来实现此效果,那将更具动态性,更加灵活。现在,你可以为那些永远要排在前面的文档设置一个无比大的boost值了!

 

 

 

 


1
0
分享到:
评论

相关推荐

    IBM-海尔人力资源转型会议(报告全文).pdf

    IBM-海尔人力资源转型会议(报告全文).pdf

    《刘禹锡《秋词》》PPT课件教案模板.pptx

    《刘禹锡《秋词》》PPT课件教案模板.pptx

    sentinel-spring-webmvc-adapter-1.8.0.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    毕业论文-场地预定V2.17.0+收银V1.10.0+会员V1.80.0+小程序-整站商业源码.zip

    毕业论文-场地预定V2.17.0+收银V1.10.0+会员V1.80.0+小程序-整站商业源码.zip

    模块化多电平换流器(MMC)基于Matlab-Simulink的最近电平逼近调制与双闭环控制策略仿真研究

    内容概要:本文详细介绍了模块化多电平换流器(MMC)在Matlab-Simulink平台上的仿真研究。重点讨论了采用N=22的MMC结构,通过最近电平逼近调制(NLM)技术和功率外环、电流内环的双闭环控制策略进行仿真分析。具体来说,电流内环采用了PI+前馈解耦控制方法,并引入电容电压排序优化子模块的选择。仿真结果显示,该系统能够获得对称的三相电压和电流波形,电容电压波形良好,系统在功率提升后依然保持稳定运行。 适合人群:从事电力系统、电力电子技术研究的专业人士,尤其是关注高压直流输电(HVDC)领域的研究人员和技术人员。 使用场景及目标:适用于需要深入了解MMC仿真建模、控制策略优化及其实现效果的研究项目。目标是验证MMC结构和控制策略的有效性,为实际电力系统应用提供理论支持和技术依据。 其他说明:本文不仅展示了具体的仿真步骤和参数设置,还深入分析了各部分的工作原理和优化措施,有助于读者全面掌握MMC技术的应用和发展方向。

    jakarta.servlet-api-4.0.4.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    springfox-spring-webflux-3.0.0.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    【电子设计竞赛】三端口DC-DC变换器设计与制作:光伏电池供电及电池组充放电模式自动切换系统

    内容概要:本文档是2021年全国大学生电子设计竞赛试题之一,主题为三端口DC-DC变换器。竞赛规定了严格的参赛规则,包括时间安排、队伍人数、身份验证以及比赛期间的行为准则。题目要求设计并制作一个三端口DC-DC变换器,该变换器具有两种工作模式:模式I用于模拟光伏电池向负载供电并为电池组充电,模式II用于模拟光伏电池和电池组同时为负载供电。基本要求包括在不同输入电压和负载条件下确保输出电压稳定在30V,并达到特定的电压调整率、负载调整率和效率。发挥部分则增加了自动模式切换、最大功率点跟踪等功能的要求。评分标准涵盖了设计方案、电路与程序设计、理论分析、测试方案及结果等多个方面,总分为120分。; 适合人群:参加全国大学生电子设计竞赛的本科组学生,尤其是对电力电子、DC-DC变换器设计感兴趣的电子工程专业学生。; 使用场景及目标:①帮助参赛学生理解三端口DC-DC变换器的工作原理及其设计要点;②指导学生完成从方案论证到最终测试的全过程;③确保学生能够在规定时间内高效完成设计并满足各项性能指标。; 其他说明:参赛队伍需严格遵守竞赛规则,确保设计方案的安全性和可靠性。此外,评分标准详细列出了各部分的具体要求和分值,有助于学生有针对性地准备和优化设计方案。

    313398228_按序号_新文科建设下经济类专业人才需求市场调研问卷_2487_2487.xlsx

    313398228_按序号_新文科建设下经济类专业人才需求市场调研问卷_2487_2487.xlsx

    Hyperstudy中文教程 2.pdf

    Hyperstudy中文教程 2.pdf

    IT运维管理评估方法.pdf

    IT运维管理评估方法.pdf

    MBD技术实施研究.pdf

    MBD技术实施研究.pdf

    西门子200Smart PLC MoveVelocity电子凸轮Ver1.3:实现变速与梯形加减速控制

    内容概要:本文介绍了基于西门子200Smart PLC和威纶通触摸屏的MoveVelocity电子凸轮系统Ver1.3。该系统实现了变速、梯形加减速及正反向运动控制等功能。文中详细描述了系统的组成、PLS指令编写方法及其应用特点。通过非调用库的方式编写PLS指令,确保了系统的灵活性和适应性。此外,新版本增加了运动中变速功能,进一步提升了系统的精确控制能力和复杂工业自动化需求的满足度。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程有一定基础的人群。 使用场景及目标:适用于需要精确控制设备运动速度、位置和时间的工业环境。主要目标是帮助用户掌握MoveVelocity电子凸轮系统的实现原理和操作方法,从而更好地应用于实际项目中。 其他说明:该系统不仅提供了详细的PLS指令编写指南,还强调了系统开发和维护的便捷性。未来将致力于优化系统性能,提升稳定性和可靠性。

    Kinetic新动能助力制造业智造未来.pdf

    Kinetic新动能助力制造业智造未来.pdf

    FlowPortal 以流程驱动的应用(2014扬州CIO沙龙).pdf

    FlowPortal 以流程驱动的应用(2014扬州CIO沙龙).pdf

    基于springboot的“考研资讯平台”的设计与实现(源码+数据库+文档+PPT).zip

    # 基于springboot的“考研资讯平台”的设计与实现(源码+数据库+文档+PPT) - 开发语言:Java - 数据库:MySQL - 技术:springboot - 工具:IDEA/Ecilpse、Navicat、Maven

    毕业论文- CCIA投票小程序V1.1.9开源版 前端+后端-整站商业源码.zip

    毕业论文- CCIA投票小程序V1.1.9开源版 前端+后端-整站商业源码.zip

    【Java设计精品】勤畅勤平台 - 论文、源码、PPT一站式.zip

    开发语言:Java 框架:SSM(Spring、Spring MVC、MyBatis) JDK版本:JDK 1.8 或以上 开发工具:Eclipse 或 IntelliJ IDEA Maven版本:Maven 3.3 或以上 数据库:MySQL 5.7 或以上 此压缩包包含了本毕业设计项目的完整内容,具体包括源代码、毕业论文以及演示PPT模板。 项目配置完成后即可运行,若需添加额外功能,可根据需求自行扩展。 运行条件 确保已安装 JDK 1.8 或更高版本,并正确配置 Java 环境变量。 使用 Eclipse 或 IntelliJ IDEA 打开项目,导入 Maven 依赖,确保依赖包下载完成。 配置数据库环境,确保 MySQL 服务正常运行,并导入项目中提供的数据库脚本。 在 IDE 中启动项目,确认所有服务正常运行。 主要功能简述: 用户管理:系统管理员负责管理所有用户信息,包括学生、任课老师、班主任、院系领导和学校领导的账号创建、权限分配等。 数据维护:管理员可以动态更新和维护系统所需的数据,如学生信息、课程安排、学年安排等,确保系统的正常运行。 系统配置:管理员可以对系统进行配置,如设置数据库连接参数、调整系统参数等,以满足不同的使用需求。 身份验证:系统采用用户名和密码进行身份验证,确保只有授权用户才能访问系统。不同用户类型(学生、任课老师、班主任、院系领导、学校领导、系统管理员)具有不同的操作权限。 权限控制:系统根据用户类型分配不同的操作权限,确保用户只能访问和操作其权限范围内的功能和数据。 数据安全:系统采取多种措施保障数据安全,如数据库加密、访问控制等,防止数据泄露和非法访问。 请假审批流程:系统支持请假申请的逐级审批,包括班主任审批和院系领导审批(针对超过三天的请假)。学生可以随时查看请假申请的审批进展情况。 请假记录管理:系统记录学生的所有请假记录,包括请假时间、原因、审批状态及审批意见等,供学生和审批人员查询。 学生在线请假:学生可以通过系统在线填写请假申请,包括请假的起止日期和请假原因,并提交给班主任审批。超过三天的请假需经班主任审批后,再由院系领导审批。 出勤信息记录:任课老师可以在线记录学生的上课出勤情况,包括迟到、早退、旷课和请假等状态。 出勤信息查询:学生、任课老师、班主任、院系领导和学校领导均可根据权限查看不同范围的学生上课出勤信息。学生可以查看自己所有学年的出勤信息,任课老师可以查看所教班级的出勤信息,班主任和院系领导可以查看本班或本院系的出勤信息,学校领导可以查看全校的出勤信息。 出勤统计与分析:系统提供出勤统计功能,可以按班级、学期等条件统计学生的出勤情况,帮助管理人员了解学生的出勤状况

    spring-web-5.3.20.jar中文-英文对照文档.zip

    # 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    24V反激电源设计方案解析:涵盖65W至350W功率段的原理图、PCB与变压器设计

    内容概要:本文详细介绍了24V反激电源的设计方案,涵盖了65W、120W和350W三个功率段。文中不仅提供了详细的原理图、PCB布局、变压器规格以及测试报告,还分享了许多实际操作中的经验和教训。例如,在原理图部分,作者强调了关键元件的选择对电路性能的影响;在PCB布局方面,讨论了大电流走线的特殊处理方法;对于变压器绕制,则给出了具体的参数选择和注意事项。此外,还包括了一些实用的代码片段和Excel公式,帮助读者更好地理解和应用相关理论。 适合人群:电子工程师、电源设计师、硬件爱好者。 使用场景及目标:适用于需要深入了解反激电源设计原理和技术细节的专业人士,旨在提高其在实际项目中的设计能力和解决问题的能力。 其他说明:文章末尾提醒读者在进行实验时要注意安全措施,并提供了一个有趣的下期预告。

Global site tag (gtag.js) - Google Analytics