针对lucene检索结果进行排序Word格式文档下载.docx
- 文档编号:19501185
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:9
- 大小:35.47KB
针对lucene检索结果进行排序Word格式文档下载.docx
《针对lucene检索结果进行排序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《针对lucene检索结果进行排序Word格式文档下载.docx(9页珍藏版)》请在冰豆网上搜索。
某种距离,最常用的是余弦(cos)距离
②
链接分析PageRank原理
链接分析技术主要基于两个假设:
1)一个网页被多次引用,则它可能是很重要的,如果被重要的网页引用,说明自身也是重要的,网页的重要性在网页之间可以传递。
2)随机冲浪模型:
认为假定用户一开始随机地访问网页集合中的一个网页,然和跟随网页的链接向前浏览网页,不会退浏览,那么浏览下一个网页的概率是被浏览网页的量化的重要程度值。
按照以上的用户行为模型,每个网页可能被访问到的次数越多就越重要,这样的"
可能被访问的次数"
也就定义为网页的权值,PageRank值。
如何计算这个权值呢?
PageRank采用以下公式进行计算:
其中wj代表第j个网页的权值;
lij只取0、1值,代表从网页i到网页j是否存在链接;
ni代表网页i有多少个连向其它网页的链接;
d代表"
随机冲浪"
中沿着链接访问网页的平均次数。
选择合适的初始数值,递归的使用上述公式,即可得到理想的网页权值。
2、
Lucene排序计算公式
Lucene的排序公式如下:
1)
,协调因子,表示文档(d)中Term(t)出现的百分比,也就是计算查询条件(q)中不同Term(t),以及在文档中出现的数量之和,两者的数量之比。
通常在文档中出现查询Term种类越多,分值越高。
2)
,调节因子,不影响索引排序情况,只在检索时使用,主要是用来让排序结果在不同的查询条件之间可以比较。
这个条件是在搜索时候计算。
数值是根据每一个查询项权重的平方和计算得到。
计算公式如下:
3)
,文档频率,表示查询词中,每个Term在对应的结果文档中(d)中出现的次数。
查询词出现的次数越多,表示出现频率越高,文档的检索得分就越高。
为了避免获得更大的相关性函数,实际中,使用次数的平方跟作为文档频率tf的值,避免数值过度放大。
4)
,逆文档频率,检索匹配文档数量的反向函数。
按照信息理论,文档出现的次数越少,每一篇文档的信息量就会越大。
所以匹配的文档数越少,得分就越高。
而索引库中文档总数越多,找到一篇目标文档难度越大,相应的信息量也会比较大。
5)
,长度因子,每个索引词汇在域中的总体长度决定的,这个参数在索引建立时确定。
数值根据文档中实际具有的索引项个数确定。
检索词长度在文档总长度中占的比例越大,长度因子的数值也越大。
Lucene3.0之结果排序(操作篇)
Lucene相关排序流程
Lucene相关类
Query类:
一个抽象类,Lucene检索结果最终评分的总控制中心。
其它评分有关的类和对象都是由Query类来管理和生产。
Weight类接口:
定义Query权重计算的一个实现接口,可以被重用。
Weight类可以用来生成Scorer类,也可以解析评分的详细信息,另外还定义了获取Query权值的方法。
③
Scorer类:
Lucene评分机制的核心类。
类的定义是抽象类,提供的一些抽象基本的计分功能方法提供所有的评分类实现,同时还定义了评分的详细解析方法,Scorer类内部有一个Similarity对象,用来指明计算公式。
④
Lucene相似度计算的核心抽象类。
Similarity类主要处理评分计算,系统缺省使用类DefaultSimilarity类对象
3、
排序控制
使用Sort对象定制排序,通过改变文档Boost值来改变排序结果以及使用自定义的Similarity方法更改排序
4、
文档Boost加权排序
Boost是指索引建立过程中,给整篇文档或者文档的某一特定域设定的权值因子,在检索时,优先返回分数高的。
Document和Field两重Boosting参数。
通过Document对象的setBoost()方法和Field对象的setBoost()方法。
不同在于前者对文档中每一个域都修改了参数,而后者只针对指定域进行修改。
文档加权=Document-boosting*Field-boosting,默认情况下为1,一般不做修改。
Sort对象检索排序
Sort使用时通过实例化对象作为参数,通过Searcher类的search接口来实现。
Sort支持的排序功能以文档当中的域为单位,通过这种方法,可以实现一个或者多个不同域的多形式的值排序。
实际使用排序对象Sort进行排序。
主要有两种模式,一种是以字符串表示文档域的名称作为参数指定域排序,一种是直接以排序域的包装域的包装类作为参数进行排序。
Sort对象使用比较简单,只需要在对文档索引进行检索时,在检索器的Search方法中带Sort对象作为参数即可。
1)
Sort对象相关性排序
按照相关性排序时最基本的结果排序方法,使用Sort对象无参数构造函数完成的排序效果相当于Lucene默认的按相关性降序排序。
2)
Sort对象文档编号排序
某些应用场合需要对所有符合匹配度的结果,按照文档内部编号排序输出。
使用Sort对象的静态实例Sort.INDEXORDER来实现
Sort对象独立域排序
在检索过程中,把检索结果按照某一个特定域排序,非常重要。
在使用搜索引擎过程中,有时会选择使用时间排序,而在搜索引擎库中,检索词完全是另外一个域的内容,与时间没有任何关系。
这种应用中,检索关键词的匹配仍然是首要因素,匹配太低或者不匹配的文档直接不必处理,而匹配的文档则需进一步排序输出。
指定的排序域并没有进行特别限制,可以是检索词的关联域,也可以是文档中的任意其它域。
Sort对象联合域排序
多个文档域联合排序时,需要注意文档域的添加次序。
排序的结果先按照第一个域排序,然后第二个域作为次要关键字排序。
开发时,需要根据自己的需要选择合适的次序。
Sort对象逆向排序
Sort(field,true)或者Sort(field,false)实现升降序排序。
Lucene3.0之结果排序(示例篇)
这个例子是根据《开发自己的搜索引擎:
Lucene2.0+Heritrix》中的例子改的,由于原书中是使用Lucene2.0,所以代码有部分改动。
packagesortApp;
importjava.io.File;
importorg.apache.lucene.analysis.standard.StandardAnalyzer;
importorg.apache.lucene.document.Document;
importorg.apache.lucene.document.Field;
importorg.apache.lucene.index.IndexWriter;
importorg.apache.lucene.index.Term;
importorg.apache.lucene.index.IndexWriter.MaxFieldLength;
importorg.apache.lucene.search.IndexSearcher;
importorg.apache.lucene.search.ScoreDoc;
importorg.apache.lucene.search.Sort;
importorg.apache.lucene.search.TermQuery;
importorg.apache.lucene.store.Directory;
importorg.apache.lucene.store.FSDirectory;
importorg.apache.lucene.util.Version;
publicclassSortTest{
publicstaticvoidmakeItem(IndexWriterwriter,StringbookNumber,
StringbookName,StringpublishDate)throwsException{
writer.setUseCompoundFile(false);
Documentdoc=newDocument();
Fieldf1=newField("
bookNumber"
bookNumber,Field.Store.YES,
Field.Index.NOT_ANALYZED);
Fieldf2=newField("
bookName"
bookName,Field.Store.YES,
Field.Index.ANALYZED);
Fieldf3=newField("
publishDate"
publishDate,Field.Store.YES,
doc.add(f1);
doc.add(f2);
doc.add(f3);
writer.addDocument(doc);
}
publicstaticvoidmain(String[]args){
StringIndex_Store_Path="
D:
/index/1"
;
Filefile=newFile(Index_Store_Path);
try{
DirectoryIndex=FSDirectory.open(file);
IndexWriterwriter=newIndexWriter(Index,newStandardAnalyzer(Version.LUCENE_CURRENT),true,
MaxFieldLength.LIMITED);
Documentdoc1=newDocument();
Fieldf11=newField("
"
0000001"
Field.Store.YES,Field.Index.NOT_ANALYZED);
Fieldf12=newField("
钢铁是怎样炼成的"
Field.Store.YES,Field.Index.ANALYZED);
Fieldf13=newField("
1970-01-01"
doc1.add(f11);
doc1.add(f12);
doc1.add(f13);
Documentdoc2=newDocument();
Fieldf21=newField("
0000002"
Fieldf22=newField("
钢铁战士"
Fieldf23=newField("
doc2.add(f21);
doc2.add(f22);
doc2.add(f23);
Documentdoc3=newDocument();
Fieldf31=newField("
0000003"
Fieldf32=newField("
篱笆女人和狗"
Fieldf33=newField("
doc3.add(f31);
doc3.add(f32);
doc3.add(f33);
Documentdoc4=newDocument();
Fieldf41=newField("
0000004"
Fieldf42=newField("
女人是水做的"
Fieldf43=newField("
doc4.add(f41);
doc4.add(f42);
doc4.add(f43);
Documentdoc5=newDocument();
Fieldf51=newField("
0000005"
Fieldf52=newField("
英雄儿女"
Fieldf53=newField("
doc5.add(f51);
doc5.add(f52);
doc5.add(f53);
Documentdoc6=newDocument();
Fieldf61=newField("
0000006"
Fieldf62=newField("
白毛女"
Fieldf63=newField("
doc6.add(f61);
doc6.add(f62);
doc6.add(f63);
Documentdoc7=newDocument();
Fieldf71=newField("
0000007"
Fieldf72=newField("
我的兄弟和女儿"
Fieldf73=newField("
doc7.add(f71);
doc7.add(f72);
doc7.add(f73);
writer.addDocument(doc1);
writer.addDocument(doc2);
writer.addDocument(doc3);
writer.addDocument(doc4);
writer.addDocument(doc5);
writer.addDocument(doc6);
writer.addDocument(doc7);
writer.optimize();
writer.close();
IndexSearchersearcher=newIndexSearcher(Index);
TermQueryq=newTermQuery(newTerm("
女"
));
ScoreDoc[]hits=searcher.search(q,null,1000,Sort.RELEVANCE).scoreDocs;
for(inti=0;
i<
hits.length;
i++){
DocumenthitDoc=searcher.doc(hits[i].doc);
System.out.print("
书名:
"
);
System.out.println(hitDoc.get("
得分:
System.out.println(hits[i].score);
内部ID:
System.out.println(hits[i].doc);
书号:
发行日期:
}
}catch(Exceptione){
e.printStackTrace();
}
运行结果:
Sort属性设为RELEVANCE:
Sort属性设为INDEXORDE:
去除Sort参数后:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 针对 lucene 检索 结果 进行 排序