zoukankan      html  css  js  c++  java
  • 利用Boost影响Lucene查询结果的排序

    转自: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.           
    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 

  • 相关阅读:
    Laravel 底层原理:门面(Facades)
    用 PHP和Golang 来刷leetCode 之 无重复字符 最长子串
    今天发现一个好用的查询IP地址的工具,记录一波
    Ubuntu下安装SDL
    敏捷宣言
    python 读取xml文档
    每个程序员都必须遵守的编程原则
    作为Web开发人员,我为什么喜欢Google Chrome浏览器
    爬虫
    Python为什么要self
  • 原文地址:https://www.cnblogs.com/duanweishi/p/5078562.html
Copyright © 2011-2022 走看看