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

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

  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 影响排序

  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 影响排序

  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

利用Boost影响Lucene查询结果的排序的更多相关文章

  1. lucene 查询+分页+排序

    lucene 查询+分页+排序 1.定义一个工厂类 LuceneFactory 1 import java.io.IOException; 2 3 import org.apache.lucene.a ...

  2. 有关Lucene的问题(4):影响Lucene对文档打分的四种方式

    原文出自:http://forfuture1978.iteye.com/blog/591804点击打开链接 在索引阶段设置Document Boost和Field Boost,存储在(.nrm)文件中 ...

  3. query_string查询支持全部的Apache Lucene查询语法 低频词划分依据 模糊查询 Disjunction Max

    3.3 基本查询3.3.1词条查询 词条查询是未经分析的,要跟索引文档中的词条完全匹配注意:在输入数据中,title字段含有Crime and Punishment,但我们使用小写开头的crime来搜 ...

  4. lucene查询解析器语法

    注意:使用QueryParser查询,关键词是会被分词的,如果不需要分词,可以选择使用Lucene提供的API查询类. Lucene提供了丰富的API来组合定制你所需要的查询器,同时也可以利用Quer ...

  5. Lucene查询条数限制

    运用Lucene进行索引,在查询的时候是有条数限制的 public virtual TopFieldDocs Search(Query query, Filter filter, int n, Sor ...

  6. 利用SQL索引提高查询速度

    1.合理使用索引 索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率.现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构. 索引的使用要恰到好处,其使用原则如下: 在经常进行连接 ...

  7. 基于Lucene查询原理分析Elasticsearch的性能

    前言 Elasticsearch是一个很火的分布式搜索系统,提供了非常强大而且易用的查询和分析能力,包括全文索引.模糊查询.多条件组合查询.地理位置查询等等,而且具有一定的分析聚合能力.因为其查询场景 ...

  8. Lucene 查询原理 传统二级索引方案 倒排链合并 倒排索引 跳表 位图

    提问: 1.倒排索引与传统数据库的索引相比优势? 2.在lucene中如果想做范围查找,根据上面的FST模型可以看出来,需要遍历FST找到包含这个range的一个点然后进入对应的倒排链,然后进行求并集 ...

  9. 利用DetachedCriteria实现模糊查询和分页

      分类: Java-Developing  前段时间在做模糊查询,并利用数据库分页,DAO用hibernate实现,刚开始的时候 根据业务层的数据,拼hql语句进行查询,且不说要进行一些if判断,单 ...

随机推荐

  1. signtool对EXE进行签名

    https://msdn.microsoft.com/zh-cn/library/9sh96ycy(VS.80).aspx .NET Framework 2.0   其他版本   文件签名工具使用 A ...

  2. Sqlserver 笔记 持续更新

    1.sp_spaceused : sp_spaceused table_name ----------------------------------------------------------- ...

  3. 更改SAP GUI 登陆背景

    您也可以定制初始屏幕(SAP Easy Access): 所有用户的全局设置:o   更改位于初始屏幕右侧的登录 -   如果希望将登录放置在初始屏幕右侧,请按如下处理:        使用事务 SW ...

  4. poj 2955 括号匹配 区间dp

    Brackets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6033   Accepted: 3220 Descript ...

  5. iPhone 上拨号键盘的发音规律

    上个学期在信号处理课上选做的题目和这个问题正好相关. 如焕杰同学所说,iPhone拨号音是使用双音多频信号(DTMF).双音多频信号是贝尔实验室发明的,通常用于发送被叫号码,它取代了早起的脉冲拨号方法 ...

  6. MySQL 参数autoReconnect=true 解决8小时连接失效

    <!--  dataSource加参数    处理mysql 8小时自动断开连接的问题 --> <property name="testWhileIdle" va ...

  7. php5.2.6+apache2.2.15配置

    首先下载软件,忘记php下载地址了,apache是官网. 文件名 httpd-2.2.15-win32-x86-openssl-0.9.8m-r2.msi php-5.2.6-win32-instal ...

  8. python--列表生成式--8

    原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 一.生成列表 要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],我 ...

  9. leetcode 151. Reverse Words in a String --------- java

    Given an input string, reverse the string word by word. For example,Given s = "the sky is blue& ...

  10. Docker安装及基本使用方法

    Docker安装 CentOS6上安装Docker # yum -y install epel-release # yum -y install docker-io CentOS7上安装Docker ...