轉自:http://catastiger.iteye.com/blog/803796
前提:不對結果做sort操作.?
?? 在搜索中,并不是所有的Document和Fields都是平等的.有些技術會要求到對其Doucment或者Fields的權值改變,默認值為:1.0F,以上需求都是通過改變Document的boost因子來改變的. 下面是通過lucene3.0,IKAnalyzer?
1.通過設置doc boost改變排序結果?
?
Java代碼??
????/**??????*?設置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 影響排序?
Java代碼??
?/**??????*?設置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 影響排序?
Java代碼??
/**??????*?設置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?
總結
以上是生活随笔為你收集整理的【转载保存】lucene3.0可以对docId、docField、queryParser设置Boost值来影响排序结果的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。