转自:http://catastiger.iteye.com/blog/803796

前提:不对结果做sort操作. 
   在搜索中,并不是所有的Document和Fields都是平等的.有些技术会要求到对其Doucment或者Fields的权值改变,默认值为:1.0F,以上需求都是通过改变Document的boost因子来改变的. 下面是通过lucene3.0,IKAnalyzer 
1.通过设置doc boost改变排序结果

Java代码

  1. /**
  2. * 设置DOC boost 值影响查询排序结果
  3. * @throws Exception
  4. */
  5. public void testBoost1() throws Exception{
  6. System.out.println("设置DOC boost 值影响查询排序结果");
  7. RAMDirectory ramDir = new RAMDirectory();
  8. Analyzer analyzer = new IKAnalyzer();
  9. IndexWriter iw = new IndexWriter(ramDir, analyzer, true ,IndexWriter.MaxFieldLength.LIMITED);
  10. String[] nameList = { "you are my friend", "a are my wife", "I love you" };
  11. String[] addList = { "b", "you are my wife", "c" };
  12. String[] fileList = { "1", "2", "3" };
  13. for (int i = 0; i < nameList.length; i++){
  14. Document doc = new Document();
  15. doc.add(new Field("name", nameList[i], Field.Store.YES, Field.Index.ANALYZED));
  16. doc.add(new Field("file", fileList[i], Field.Store.YES, Field.Index.ANALYZED));
  17. doc.add(new Field("address", addList[i], Field.Store.YES, Field.Index.ANALYZED));
  18. if (i == 2) {
  19. doc.setBoost(2.0f);
  20. }
  21. //            这里设置了第三个文档优先级最高,所以在搜索出来的结果中,该文档排在最前
  22. iw.addDocument(doc);
  23. }
  24. iw.close();
  25. IndexSearcher _searcher = new IndexSearcher(ramDir);
  26. String[] fields =new String[]{"name","address"};
  27. Query query=IKQueryParser.parseMultiField(fields, "you");
  28. TopDocs topDocs = _searcher.search(query,_searcher.maxDoc());
  29. ScoreDoc[] hits = topDocs.scoreDocs;
  30. for (int i = 0; i < hits.length; i++) {
  31. Document doc = _searcher.doc(hits[i].doc);
  32. System.out.println("name:"+doc.get("name"));
  33. System.out.println("file:"+doc.get("file"));
  34. }
  35. _searcher.close();
  36. }

if (i == 2) { doc.setBoost(2.0f); }这样I love you 将先输出, 
2.通过设置query 影响排序

Java代码

  1. /**
  2. * 设置query boost值影响排序结果,如果有排序sort,则完全按照sort结果进行
  3. * @throws Exception
  4. */
  5. public void testBoost2() throws Exception{
  6. System.out.println("设置query boost值影响排序结果");
  7. RAMDirectory ramDir = new RAMDirectory();
  8. Analyzer analyzer = new IKAnalyzer();
  9. IndexWriter iw = new IndexWriter(ramDir, analyzer, true ,IndexWriter.MaxFieldLength.LIMITED);
  10. String[] nameList = { "you are my friend", "a are my wife", "I love you" };
  11. String[] addList = { "b", "you are my wife", "c" };
  12. String[] fileList = { "1", "2", "3" };
  13. for (int i = 0; i < nameList.length; i++)
  14. {
  15. Document doc = new Document();
  16. doc.add(new Field("name", nameList[i], Field.Store.YES, Field.Index.ANALYZED));
  17. doc.add(new Field("file", fileList[i], Field.Store.YES, Field.Index.ANALYZED));
  18. doc.add(new Field("address", addList[i], Field.Store.YES, Field.Index.ANALYZED));
  19. iw.addDocument(doc);
  20. }
  21. iw.close();
  22. IndexSearcher _searcher = new IndexSearcher(ramDir);
  23. BooleanQuery bq = new BooleanQuery();
  24. QueryParser _parser = new QueryParser(Version.LUCENE_30,"name",analyzer);
  25. Query  _query = _parser.parse("you");
  26. _query.setBoost(2f);
  27. QueryParser _parser1 = new QueryParser(Version.LUCENE_30,"address",analyzer);
  28. Query  _query1 = _parser1.parse("you");
  29. _query1.setBoost(1f);
  30. bq.add(_query, BooleanClause.Occur.SHOULD);
  31. bq.add(_query1, BooleanClause.Occur.SHOULD);
  32. //
  33. //          for(int i=0;i<2;i++){
  34. //              QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30,new String[] {"name", "address" }, analyzer);
  35. //              Query q1 = parser.parse("you");
  36. //              bq.add(q1, BooleanClause.Occur.MUST);
  37. //          }
  38. //
  39. //         SortField[] sortFields = new SortField[1];
  40. //         SortField sortField = new SortField("file", SortField.INT, true);//false升序,true降序
  41. //         sortFields[0] = sortField;
  42. //         Sort sort = new Sort(sortFields);
  43. //         TopDocs topDocs = _searcher.search(bq,null,_searcher.maxDoc(),sort);
  44. //
  45. TopDocs topDocs = _searcher.search(bq,_searcher.maxDoc());
  46. ScoreDoc[] hits = topDocs.scoreDocs;
  47. for (int i = 0; i < hits.length; i++) {
  48. Document doc = _searcher.doc(hits[i].doc);
  49. System.out.println("name:"+doc.get("name"));
  50. System.out.println("file:"+doc.get("file"));
  51. }
  52. _searcher.close();
  53. }

结果如下:(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 影响排序

Java代码

  1. /**
  2. * 设置field boost 值影响查询排序结果,有排序则按照排序
  3. * @throws Exception
  4. */
  5. //没设置field boost 213 设置后是132
  6. public void testBoost3() throws Exception{
  7. System.out.println("设置fields boost 值影响查询排序结果");
  8. RAMDirectory ramDir = new RAMDirectory();
  9. Analyzer analyzer = new IKAnalyzer();
  10. IndexWriter iw = new IndexWriter(ramDir, analyzer, true ,IndexWriter.MaxFieldLength.LIMITED);
  11. String[] nameList = { "you are my friend", "a are my wife", "I love you" };
  12. String[] addList = { "b", "you are my wife", "c" };
  13. String[] fileList = { "1", "2", "3" };
  14. for (int i = 0; i < nameList.length; i++)
  15. {
  16. Document doc = new Document();
  17. Field nameField =  new Field("name", nameList[i], Field.Store.YES, Field.Index.ANALYZED);
  18. nameField.setBoost(20f);
  19. doc.add(nameField);
  20. doc.add(new Field("file", fileList[i], Field.Store.YES, Field.Index.ANALYZED));
  21. Field f = new Field("address", addList[i], Field.Store.YES, Field.Index.ANALYZED);
  22. f.setBoost(30f);
  23. doc.add(f);
  24. iw.addDocument(doc);
  25. }
  26. iw.close();
  27. IndexSearcher _searcher = new IndexSearcher(ramDir);
  28. String[] fields =new String[]{"name","file","address"};
  29. Query query=IKQueryParser.parseMultiField(fields, "you");
  30. //        SortField[] sortFields = new SortField[1];
  31. //        SortField sortField = new SortField("file", SortField.INT, true);//false升序,true降序
  32. //        sortFields[0] = sortField;
  33. //        Sort sort = new Sort(sortFields);
  34. //        TopDocs topDocs = _searcher.search(query,null,_searcher.maxDoc(),sort);
  35. TopDocs topDocs = _searcher.search(query,_searcher.maxDoc());
  36. ScoreDoc[] hits = topDocs.scoreDocs;
  37. for (int i = 0; i < hits.length; i++) {
  38. Document doc = _searcher.doc(hits[i].doc);
  39. System.out.println("name:"+doc.get("name"));
  40. System.out.println("file:"+doc.get("file"));
  41. }
  42. _searcher.close();
  43. }

结果如下:(address 的boost最高,先排在前面了) 
设置fields boost 值影响查询排序结果 
name:a are my wife 
file:2 
name:you are my friend 
file:1 
name:I love you 
file:3

【转载保存】lucene3.0可以对docId、docField、queryParser设置Boost值来影响排序结果相关推荐

  1. Lucene-3.0.0配置

    Lucene-3.0.0配置 2009-12-02 21:38 一.Lucene开发环境配置 step1.Lucene开发包下载 step2.Java开发环境配置 step3.Tomcat安装 ste ...

  2. lucene3.0范围查找TermRangeQuery

    原文链接:http://www.wenhq.com/article/view_415.html 欢迎转载,请注明出处:亲亲宝宝 lucene3.0范围查找TermRangeQuery 在lucene3 ...

  3. lucene3.0中使用MultiFieldQueryParser多字段查找

    使用Lucene做全文检索,一般我们经常会在多个字段(域)中查找,而不一定关心在那个字段中包含需要查找的值.比如在搜索框中输入:亲亲宝宝 软件开发,只要标题.内容.作者等包含"亲亲宝宝 软件 ...

  4. [转载]IIS 6.0配置HTTP压缩的步骤

    [转载]IIS 6.0配置HTTP压缩的步骤 原文: http://zlei12.go.nease.net/ 1. HTTP压缩概述 HTTP压缩是在Web服务器和浏览器间传输压缩文本内容的方法.HT ...

  5. [转载]AxureRP 7.0部件详解(一)

    转载]AxureRP 7.0部件详解(一) 本文为Axure RT7.0教程,本章主要介绍menu菜单.table表格.Tree Widget 树部件三个部件,后续将持续更新...... Menu 菜 ...

  6. mongodb 3.0.x 添加用户名和密码设置权限

    mongodb 3.0.x 添加用户名,密码,权限设置 最近遇到关于mongodb 3.0.x权限设置的问题,做了一下总结: 第一给mongodb 3.0.x 添加user 第一步修改配置文件: xx ...

  7. InnoDB 的辅助索引叶子节点为什么不直接保存的记录地址而要存主键键值

    转载自  InnoDB 的辅助索引叶子节点为什么不直接保存的记录地址而要存主键键值 RT,最近看书关于innodb的 InnoDB是索引组织表,所以完整的数据记录都存在聚集索引的叶子节点上 辅助索引的 ...

  8. ODOO v10.0 自动生成财务凭证的科目设置

    ODOO v10.0 自动生成财务凭证的科目设置 可以在产品类别及产品档案里设置,建议在产品类别下设置,方便维护. 项目 设置为(具体科目以公司科目表为主) 对应作用业务 Income Account ...

  9. 显示一张桌子的信息,包括桌子的形状(长方形、方形、圆形、椭圆形;使用Rect、Square、Circle、Ellipse)、腿数、高度、桌面面积。定义变量来保存桌子的信息,并显示各个信息的值。要点提示

    [问题描述] 显示一张桌子的信息,包括桌子的形状(长方形.方形.圆形.椭圆形:使用Rect.Square.Circle.Ellipse).腿数.高度.桌面面积.定义变量来保存桌子的信息,并显示各个信息 ...

最新文章

  1. Ajax学习-Ajax简介
  2. C++中的静态成员函数
  3. 笔记-信息化与系统集成技术-工作流
  4. python生成泊松分布随机数_泊松分布随机数
  5. 小程序影视APP/追剧吧/脱离微擎/可用火车头采集小程序影视
  6. CV Code | 计算机视觉开源周报 20190603期
  7. 硬盘坏道隔离工具fbdisk_如何屏蔽硬盘坏道 屏蔽硬盘坏道方法介绍【详解】
  8. 学习Java,真的可以月薪过万嘛?真实个人经历告诉你,记录了平时学习的内容以及学习过程中最真实的感受(二)
  9. Angr安装与使用之使用篇(一)
  10. 约瑟夫环c语言代码加注释,约瑟夫环c语言代码原创.doc
  11. 用Python画二元高次方程
  12. 测试体质的软件有哪些,有哪些APP可以测体脂?测体脂率APP分享
  13. 利用好 git bisect 这把利器,帮助你快速定位疑难 Bug
  14. uniapp使用微信小程序自定义组件
  15. java list 随机获取n个_java – 从列表中取n个随机元素?
  16. 6、英飞凌-AURIX-TC3XX: PWM实验之使用 GTM -ATOM 实现
  17. 灌注桩如何计算机械台班,钢护筒造价计算及套定额
  18. MSBUILD : error MSB4132: The tools version “2.0“ is unrecognized. Available tools versions are “4.0“
  19. FatMouse' Trade--贪心
  20. Win7如何录制内部声音 电脑录音软件在线录音

热门文章

  1. 阿波罗配置中心(apollo)的个人看法
  2. [前台]---ajax返回200成功,却进入error函数的解决方法
  3. ceph编译_Ceph编译安装教程
  4. 安装redis提示[test] error 2_安装PHP Redis扩展
  5. 编写五子棋的完整python代码_python实现五子棋游戏
  6. JAVA入门级教学之(关于JVM的内存管理机制)
  7. JAVA入门级教学之(第一章总结)
  8. python coding utf-8_【转】怎么在Python里使用UTF-8编码
  9. tsp matlab,五个城市的TSP问题MATLAB程序.doc
  10. mysql 5.6.14 win32_mysql-5.6.14-win32为免安装解压缩版