日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/8/23 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转载保存】lucene3.0可以对docId、docField、queryParser设置Boost值来影响排序结果 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自: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值来影响排序结果的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。