【转】利用Boost影响Lucene查询结果的排序

来源:互联网 发布:excel怎么做数据筛选 编辑:程序博客网 时间:2024/06/07 16:42

前提:不对结果做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.           
  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.   
  15.         for (int i = 0; i < nameList.length; i++){  
  16.             Document doc = new Document();  
  17.             doc.add(new Field("name", nameList[i], Field.Store.YES, Field.Index.ANALYZED));  
  18.             doc.add(new Field("file", fileList[i], Field.Store.YES, Field.Index.ANALYZED));  
  19.             doc.add(new Field("address", addList[i], Field.Store.YES, Field.Index.ANALYZED));  
  20.             if (i == 2) {  
  21.                 doc.setBoost(2.0f);   
  22.             }  
  23. //            这里设置了第三个文档优先级最高,所以在搜索出来的结果中,该文档排在最前  
  24.             iw.addDocument(doc);  
  25.         }  
  26.         iw.close();  
  27.   
  28.         IndexSearcher _searcher = new IndexSearcher(ramDir);  
  29.         String[] fields =new String[]{"name","address"};  
  30.         Query query=IKQueryParser.parseMultiField(fields, "you");  
  31.   
  32.         TopDocs topDocs = _searcher.search(query,_searcher.maxDoc());  
  33.         ScoreDoc[] hits = topDocs.scoreDocs;  
  34.         for (int i = 0; i < hits.length; i++) {  
  35.             Document doc = _searcher.doc(hits[i].doc);  
  36.             System.out.println("name:"+doc.get("name"));  
  37.             System.out.println("file:"+doc.get("file"));  
  38.         }  
  39.         _searcher.close();  
  40.           
  41.     }  
  42.   
  43.     


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.           
  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.   
  15.         for (int i = 0; i < nameList.length; i++)  
  16.         {  
  17.             Document doc = new Document();  
  18.             doc.add(new Field("name", nameList[i], Field.Store.YES, Field.Index.ANALYZED));  
  19.             doc.add(new Field("file", fileList[i], Field.Store.YES, Field.Index.ANALYZED));  
  20.             doc.add(new Field("address", addList[i], Field.Store.YES, Field.Index.ANALYZED));  
  21.             iw.addDocument(doc);  
  22.         }  
  23.         iw.close();  
  24.         IndexSearcher _searcher = new IndexSearcher(ramDir);  
  25.           
  26.         BooleanQuery bq = new BooleanQuery();  
  27.         QueryParser _parser = new QueryParser(Version.LUCENE_30,"name",analyzer);  
  28.         Query  _query = _parser.parse("you");  
  29.         _query.setBoost(2f);  
  30.           
  31.         QueryParser _parser1 = new QueryParser(Version.LUCENE_30,"address",analyzer);  
  32.         Query  _query1 = _parser1.parse("you");  
  33.         _query1.setBoost(1f);  
  34.          
  35.         bq.add(_query, BooleanClause.Occur.SHOULD);  
  36.         bq.add(_query1, BooleanClause.Occur.SHOULD);  
  37. //         
  38.           
  39. //          for(int i=0;i<2;i++){  
  40. //              QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30,new String[] {"name", "address" }, analyzer);  
  41. //              Query q1 = parser.parse("you");  
  42. //              bq.add(q1, BooleanClause.Occur.MUST);  
  43. //          }  
  44. //           
  45. //         SortField[] sortFields = new SortField[1];    
  46. //         SortField sortField = new SortField("file", SortField.INT, true);//false升序,true降序    
  47. //         sortFields[0] = sortField;    
  48. //         Sort sort = new Sort(sortFields);    
  49. //         TopDocs topDocs = _searcher.search(bq,null,_searcher.maxDoc(),sort);  
  50. //          
  51.           
  52.         TopDocs topDocs = _searcher.search(bq,_searcher.maxDoc());  
  53.         ScoreDoc[] hits = topDocs.scoreDocs;  
  54.         for (int i = 0; i < hits.length; i++) {  
  55.             Document doc = _searcher.doc(hits[i].doc);  
  56.             System.out.println("name:"+doc.get("name"));  
  57.             System.out.println("file:"+doc.get("file"));  
  58.         }  
  59.         _searcher.close();  
  60.           
  61.     }  


结果如下:(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.   
  15.         for (int i = 0; i < nameList.length; i++)  
  16.         {  
  17.             Document doc = new Document();  
  18.             Field nameField =  new Field("name", nameList[i], Field.Store.YES, Field.Index.ANALYZED);  
  19.             nameField.setBoost(20f);  
  20.             doc.add(nameField);  
  21.             doc.add(new Field("file", fileList[i], Field.Store.YES, Field.Index.ANALYZED));  
  22.             Field f = new Field("address", addList[i], Field.Store.YES, Field.Index.ANALYZED);  
  23.             f.setBoost(30f);  
  24.             doc.add(f);  
  25.             iw.addDocument(doc);  
  26.         }  
  27.         iw.close();  
  28.           
  29.          
  30.         IndexSearcher _searcher = new IndexSearcher(ramDir);  
  31.         String[] fields =new String[]{"name","file","address"};  
  32.         Query query=IKQueryParser.parseMultiField(fields, "you");  
  33.           
  34. //        SortField[] sortFields = new SortField[1];    
  35. //        SortField sortField = new SortField("file", SortField.INT, true);//false升序,true降序    
  36. //        sortFields[0] = sortField;    
  37. //        Sort sort = new Sort(sortFields);    
  38. //        TopDocs topDocs = _searcher.search(query,null,_searcher.maxDoc(),sort);  
  39.           
  40.         TopDocs topDocs = _searcher.search(query,_searcher.maxDoc());  
  41.         ScoreDoc[] hits = topDocs.scoreDocs;  
  42.         for (int i = 0; i < hits.length; i++) {  
  43.             Document doc = _searcher.doc(hits[i].doc);  
  44.             System.out.println("name:"+doc.get("name"));  
  45.             System.out.println("file:"+doc.get("file"));  
  46.         }  
  47.         _searcher.close();  
  48.           
  49.     }  


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

转自:http://catastiger.iteye.com/blog/803796
0 0
原创粉丝点击