利用Boost影响Lucene查询结果的排序
转自:http://catastiger.iteye.com/blog/803796
前提:不对结果做sort操作.
在搜索中,并不是所有的Document和Fields都是平等的.有些技术会要求到对其Doucment或者Fields的权值改变,默认值为:1.0F,以上需求都是通过改变Document的boost因子来改变的. 下面是通过lucene3.0,IKAnalyzer
1.通过设置doc boost改变排序结果
- /**
- * 设置DOC boost 值影响查询排序结果
- * @throws Exception
- */
- public void testBoost1() throws Exception{
- System.out.println("设置DOC boost 值影响查询排序结果");
- RAMDirectory ramDir = new RAMDirectory();
- Analyzer analyzer = new IKAnalyzer();
- IndexWriter iw = new IndexWriter(ramDir, analyzer, true ,IndexWriter.MaxFieldLength.LIMITED);
- String[] nameList = { "you are my friend", "a are my wife", "I love you" };
- String[] addList = { "b", "you are my wife", "c" };
- String[] fileList = { "1", "2", "3" };
- for (int i = 0; i < nameList.length; i++){
- Document doc = new Document();
- doc.add(new Field("name", nameList[i], Field.Store.YES, Field.Index.ANALYZED));
- doc.add(new Field("file", fileList[i], Field.Store.YES, Field.Index.ANALYZED));
- doc.add(new Field("address", addList[i], Field.Store.YES, Field.Index.ANALYZED));
- if (i == 2) {
- doc.setBoost(2.0f);
- }
- // 这里设置了第三个文档优先级最高,所以在搜索出来的结果中,该文档排在最前
- iw.addDocument(doc);
- }
- iw.close();
- IndexSearcher _searcher = new IndexSearcher(ramDir);
- String[] fields =new String[]{"name","address"};
- Query query=IKQueryParser.parseMultiField(fields, "you");
- TopDocs topDocs = _searcher.search(query,_searcher.maxDoc());
- ScoreDoc[] hits = topDocs.scoreDocs;
- for (int i = 0; i < hits.length; i++) {
- Document doc = _searcher.doc(hits[i].doc);
- System.out.println("name:"+doc.get("name"));
- System.out.println("file:"+doc.get("file"));
- }
- _searcher.close();
- }
if (i == 2) { doc.setBoost(2.0f); }这样I love you 将先输出,
2.通过设置query 影响排序
- /**
- * 设置query boost值影响排序结果,如果有排序sort,则完全按照sort结果进行
- * @throws Exception
- */
- public void testBoost2() throws Exception{
- System.out.println("设置query boost值影响排序结果");
- RAMDirectory ramDir = new RAMDirectory();
- Analyzer analyzer = new IKAnalyzer();
- IndexWriter iw = new IndexWriter(ramDir, analyzer, true ,IndexWriter.MaxFieldLength.LIMITED);
- String[] nameList = { "you are my friend", "a are my wife", "I love you" };
- String[] addList = { "b", "you are my wife", "c" };
- String[] fileList = { "1", "2", "3" };
- for (int i = 0; i < nameList.length; i++)
- {
- Document doc = new Document();
- doc.add(new Field("name", nameList[i], Field.Store.YES, Field.Index.ANALYZED));
- doc.add(new Field("file", fileList[i], Field.Store.YES, Field.Index.ANALYZED));
- doc.add(new Field("address", addList[i], Field.Store.YES, Field.Index.ANALYZED));
- iw.addDocument(doc);
- }
- iw.close();
- IndexSearcher _searcher = new IndexSearcher(ramDir);
- BooleanQuery bq = new BooleanQuery();
- QueryParser _parser = new QueryParser(Version.LUCENE_30,"name",analyzer);
- Query _query = _parser.parse("you");
- _query.setBoost(2f);
- QueryParser _parser1 = new QueryParser(Version.LUCENE_30,"address",analyzer);
- Query _query1 = _parser1.parse("you");
- _query1.setBoost(1f);
- bq.add(_query, BooleanClause.Occur.SHOULD);
- bq.add(_query1, BooleanClause.Occur.SHOULD);
- //
- // for(int i=0;i<2;i++){
- // QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30,new String[] {"name", "address" }, analyzer);
- // Query q1 = parser.parse("you");
- // bq.add(q1, BooleanClause.Occur.MUST);
- // }
- //
- // SortField[] sortFields = new SortField[1];
- // SortField sortField = new SortField("file", SortField.INT, true);//false升序,true降序
- // sortFields[0] = sortField;
- // Sort sort = new Sort(sortFields);
- // TopDocs topDocs = _searcher.search(bq,null,_searcher.maxDoc(),sort);
- //
- TopDocs topDocs = _searcher.search(bq,_searcher.maxDoc());
- ScoreDoc[] hits = topDocs.scoreDocs;
- for (int i = 0; i < hits.length; i++) {
- Document doc = _searcher.doc(hits[i].doc);
- System.out.println("name:"+doc.get("name"));
- System.out.println("file:"+doc.get("file"));
- }
- _searcher.close();
- }
结果如下:(name 的boost最高,所以name优先于address排序在前面)
设置query boost值影响排序结果
name:you are my friend
file:1
name:I love you
file:3
name:a are my wife
file:2
3.通过设置fields 的boost 影响排序
- /**
- * 设置field boost 值影响查询排序结果,有排序则按照排序
- * @throws Exception
- */
- //没设置field boost 213 设置后是132
- public void testBoost3() throws Exception{
- System.out.println("设置fields boost 值影响查询排序结果");
- RAMDirectory ramDir = new RAMDirectory();
- Analyzer analyzer = new IKAnalyzer();
- IndexWriter iw = new IndexWriter(ramDir, analyzer, true ,IndexWriter.MaxFieldLength.LIMITED);
- String[] nameList = { "you are my friend", "a are my wife", "I love you" };
- String[] addList = { "b", "you are my wife", "c" };
- String[] fileList = { "1", "2", "3" };
- for (int i = 0; i < nameList.length; i++)
- {
- Document doc = new Document();
- Field nameField = new Field("name", nameList[i], Field.Store.YES, Field.Index.ANALYZED);
- nameField.setBoost(20f);
- doc.add(nameField);
- doc.add(new Field("file", fileList[i], Field.Store.YES, Field.Index.ANALYZED));
- Field f = new Field("address", addList[i], Field.Store.YES, Field.Index.ANALYZED);
- f.setBoost(30f);
- doc.add(f);
- iw.addDocument(doc);
- }
- iw.close();
- IndexSearcher _searcher = new IndexSearcher(ramDir);
- String[] fields =new String[]{"name","file","address"};
- Query query=IKQueryParser.parseMultiField(fields, "you");
- // SortField[] sortFields = new SortField[1];
- // SortField sortField = new SortField("file", SortField.INT, true);//false升序,true降序
- // sortFields[0] = sortField;
- // Sort sort = new Sort(sortFields);
- // TopDocs topDocs = _searcher.search(query,null,_searcher.maxDoc(),sort);
- TopDocs topDocs = _searcher.search(query,_searcher.maxDoc());
- ScoreDoc[] hits = topDocs.scoreDocs;
- for (int i = 0; i < hits.length; i++) {
- Document doc = _searcher.doc(hits[i].doc);
- System.out.println("name:"+doc.get("name"));
- System.out.println("file:"+doc.get("file"));
- }
- _searcher.close();
- }
结果如下:(address 的boost最高,先排在前面了)
设置fields boost 值影响查询排序结果
name:a are my wife
file:2
name:you are my friend
file:1
name:I love you
file:3
利用Boost影响Lucene查询结果的排序的更多相关文章
- lucene 查询+分页+排序
lucene 查询+分页+排序 1.定义一个工厂类 LuceneFactory 1 import java.io.IOException; 2 3 import org.apache.lucene.a ...
- 有关Lucene的问题(4):影响Lucene对文档打分的四种方式
原文出自:http://forfuture1978.iteye.com/blog/591804点击打开链接 在索引阶段设置Document Boost和Field Boost,存储在(.nrm)文件中 ...
- query_string查询支持全部的Apache Lucene查询语法 低频词划分依据 模糊查询 Disjunction Max
3.3 基本查询3.3.1词条查询 词条查询是未经分析的,要跟索引文档中的词条完全匹配注意:在输入数据中,title字段含有Crime and Punishment,但我们使用小写开头的crime来搜 ...
- lucene查询解析器语法
注意:使用QueryParser查询,关键词是会被分词的,如果不需要分词,可以选择使用Lucene提供的API查询类. Lucene提供了丰富的API来组合定制你所需要的查询器,同时也可以利用Quer ...
- Lucene查询条数限制
运用Lucene进行索引,在查询的时候是有条数限制的 public virtual TopFieldDocs Search(Query query, Filter filter, int n, Sor ...
- 利用SQL索引提高查询速度
1.合理使用索引 索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率.现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构. 索引的使用要恰到好处,其使用原则如下: 在经常进行连接 ...
- 基于Lucene查询原理分析Elasticsearch的性能
前言 Elasticsearch是一个很火的分布式搜索系统,提供了非常强大而且易用的查询和分析能力,包括全文索引.模糊查询.多条件组合查询.地理位置查询等等,而且具有一定的分析聚合能力.因为其查询场景 ...
- Lucene 查询原理 传统二级索引方案 倒排链合并 倒排索引 跳表 位图
提问: 1.倒排索引与传统数据库的索引相比优势? 2.在lucene中如果想做范围查找,根据上面的FST模型可以看出来,需要遍历FST找到包含这个range的一个点然后进入对应的倒排链,然后进行求并集 ...
- 利用DetachedCriteria实现模糊查询和分页
分类: Java-Developing 前段时间在做模糊查询,并利用数据库分页,DAO用hibernate实现,刚开始的时候 根据业务层的数据,拼hql语句进行查询,且不说要进行一些if判断,单 ...
随机推荐
- 将存储在本地的大量分散的小文件,合并并保存在hdfs文件系统中
import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java ...
- 如何让Visual Studio 清除最近打开项目 关闭上次未关闭的标签窗口
删除最近打开的文件: 打开HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\FileMRUList 删除最近打开的项目: 打开HKEY_CUR ...
- [转]在Eclipse中Debug 为什么显示source not found
在Eclipse中Debug 为什么显示source not found http://zhidao.baidu.com/link?url=-jna2HB_k2FW72GPbT--5Qg2AWi3Ip ...
- 2016 ACM/ICPC Asia Regional Dalian Online 1002/HDU 5869
Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K ( ...
- T语言TC发布脚本方法
代码模式的注册码发布脚本方法 注册码项目模式的发布脚本方法 1.注册码项目发布版 2.注册码项目代理版 这两种方法都是基于注册码项目来实现的,所以在使用之前,需要先创建注册码项目.
- 某种数列问题 (jx.cpp/c/pas) 1000MS 256MB
众所周知,chenzeyu97有无数的妹子(阿掉!>_<),而且他还有很多恶趣味的问题,继上次纠结于一排妹子的排法以后,今天他有非(chi)常(bao)认(cheng)真(zhe)去研究一 ...
- 《苹果开发之Cocoa编程》挑战2 创建一个数据源 练习
<苹果开发之Cocoa编程>第4版 P87 创建一个to-do list应用程序,在文本框中输入任务.当用户单击Add按钮时,添加字符串到一个变长队列,新任务就出现在list的末尾. 关键 ...
- C++@sublime GDB调试
正文转自:http://www.cppblog.com/lucency/archive/2012/08/09/59214.html 之前在网上搜索了好久使用sublime调试C和C++的文章,但是徒劳 ...
- cve-2015-1635 poc
import socket import random ipAddr = "10.1.89.20" hexAllFfff = " req1 = "GET / H ...
- jQuery对下拉框Select操作总结
jQuery对下拉框Select操作总结 转自网络,留做备用 jQuery获取Select元素,并选择的Text和Value: 1. $("#select_id").change( ...