本文主要是介绍11、相关度排序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.1 什么是词的权重?
通过索引部分的学习明确索引的最小单位是一个Term( 索引词典中的一个词) ,搜索也是要从Term 中搜索,再根据Term 找到文档,Term 对文档的重要性称为权重,影响Term 权重有两个因素:
l Term Frequency (tf) :
指此Term 在此文档中出现了多少次。tf 越大说明越重要。
词(Term) 在文档中出现的次数越多,说明此词(Term) 对该文档越重要,如“Lucene ”这个词,在文档中出现的次数很多,说明该文档主要就是讲Lucene 技术的。
l Document Frequency (df)
即有多少文档包含次Term 。df 越大说明越不重要。
比如,在一篇英语文档中,this 出现的次数更多,就说明越重要吗?不是的,有越多的文档包含此词(Term), 说明此词(Term) 太普通,不足以区分这些文档,因而重要性越低。
1.2 修改 boost 值影响排名
每个域上都有一个boost 值,默认是1.0f 。可以修改boost 值影响排名。
//添加文档
@Test
public void addDocumenttf() throws Exception {//打开索引库Directory directory = FSDirectory.open(Paths.get("D:\\LucentTest\\luceneIndex"));//分析器对象Analyzer analyzer=new MyWordAnalyzer();//创建一个IndexwriterConfig对象//第一个参数:lucene的版本,第二个参数:分析器对象IndexWriterConfig config=new IndexWriterConfig(analyzer);IndexWriter indexWriter = new IndexWriter(directory, config);//创建一文档对象Document document = new Document();//添加域Field nameField = new TextField("name", "什么是全文检索什么是" +"全文检索什么是全文检索什么是全文检索什么是全文检索什么是全文检索什么是全文检索" +"什么是全文检索什么是全文检索什么是全文检索什么是全文检索 java", Field.Store.YES);//设置boost值Field contentField = new TextField("name", "是全文检索什么是全文检索lucene", Field.Store.YES);contentField.setBoost(30f);document.add(nameField);document.add(contentField);//把文档写索引库indexWriter.addDocument(document);//关闭IndexwriterindexWriter.close();
}
1.2 查询索引时设置 boost
//MultiFieldQueryParser 类
@Test
public void testMultiFieldQueryParser() throws Exception {//以读的方式打开索引库Directory directory = FSDirectory.open(Paths.get("D:\\LucentTest\\luceneIndex"));//创建一个IndexReaderIndexReader indexReader = DirectoryReader.open(directory);//创建一个IndexSearcher对象IndexSearcher indexSearcher = new IndexSearcher(indexReader);/*** 原文章内容: 软件开发程序员博客文章收藏网提供'lucene多条件查询'相关的博客文章收藏*///创建查询//第一个参数是默认搜索域,如果查询时不指定要查询的域,//会到默认搜索域上进行搜索,如果指定了就按照指定的域进行搜索。//第二个参数:分析器对象//默认搜索域 配置多个域String[] fields = {"name", "content"};Map<String,Float> map=new HashMap<String,Float>();map.put("name",10f);map.put("context",5f);MultiFieldQueryParser queryParser=new MultiFieldQueryParser(fields,new MyWordAnalyzer(),map);Query query=queryParser.parse("全文检索");//执行查询TopDocs topDocs = indexSearcher.search(query, 10);System.out.println("查询结果总数量:" + topDocs.totalHits);for (ScoreDoc scoreDoc : topDocs.scoreDocs) {//取document对象Document document = indexSearcher.doc(scoreDoc.doc);System.out.println(document.get("name"));}indexSearcher.getIndexReader().close();
}
下面是小编的微信转帐二维码,小编再次谢谢读者的支持,小编会更努力的
----请看下方↓↓↓↓↓↓↓
百度搜索 Drools从入门到精通:可下载开源全套Drools教程
深度Drools教程不段更新中:
更多Drools实战陆续发布中………
扫描下方二维码关注公众号 ↓↓↓↓↓↓↓↓↓↓
这篇关于11、相关度排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!