Lucene系列:(9)搜索结果排序
生活随笔
收集整理的這篇文章主要介紹了
Lucene系列:(9)搜索结果排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、什么是搜索結果排序
? ? 搜索結果是按某個或某些字段高低排序來顯示的結果
2、影響網站排名的多種因素
? ? ?head/meta/
? ? ?網頁的標簽整潔
? ? ?網頁執行速度
? ? ?采用div+css
? ? ?。。。。。。
3、Lucene中的顯示結果次序與相關度得分有關
????ScoreDoc.score;? ? 默認情況下,Lucene是按相關度得分排序的,得分高排在前,得分低排在后
? ? 如果相關度得分相同,按插入索引庫的先后次序排序
4、Lucene中的手工設置相關度得分
IndexWriter?indexWriter?=?new?IndexWriter(LuceneUtils.getDirectory(),LuceneUtils.getAnalyzer(),LuceneUtils.getMaxFieldLength()); document.setBoost(20F); indexWriter.addDocument(document); indexWriter.close();TestSort.java
package?com.rk.lucene.f_sort;import?java.util.ArrayList; import?java.util.List;import?org.apache.lucene.document.Document; import?org.apache.lucene.index.IndexWriter; import?org.apache.lucene.queryParser.QueryParser; import?org.apache.lucene.search.IndexSearcher; import?org.apache.lucene.search.Query; import?org.apache.lucene.search.ScoreDoc; import?org.apache.lucene.search.TopDocs; import?org.apache.lucene.search.highlight.Formatter; import?org.apache.lucene.search.highlight.Fragmenter; import?org.apache.lucene.search.highlight.Highlighter; import?org.apache.lucene.search.highlight.QueryScorer; import?org.apache.lucene.search.highlight.Scorer; import?org.apache.lucene.search.highlight.SimpleFragmenter; import?org.apache.lucene.search.highlight.SimpleHTMLFormatter; import?org.junit.Test;import?com.rk.lucene.entity.Article; import?com.rk.lucene.utils.LuceneUtils;/***?在默認情況下,Lucene是按照相關度得份排序的*/ public?class?TestSort?{@Testpublic?void?testAdd()?throws?Exception{List<Article>?list?=?new?ArrayList<Article>();list.add(new?Article(1,?"疾風之刃",?"《疾風之刃》是一款超動作3D動漫風網游。作為新一代動作游戲,《疾風之刃》呈現出極致華麗的動作表演,精心打磨出的打擊感震撼人心。"));list.add(new?Article(2,?"月光疾風",?"月光疾風,日本動漫《火影忍者》中的人物,比較個人主義,性格溫和。火之國木葉村的特別上忍,中忍考試正賽預選的考官,體質似乎很不好,有著嚴重的黑眼圈、臉色蒼白且經常咳嗽,善用劍術。"));list.add(new?Article(3,?"疾風航班中文版下載",?"《疾風航班》是一款優質的動作模擬游戲。游戲中包括亞歐美洲,乃至飛往太空的5條航線,共計50個循序漸進的關卡,以及具有挑戰性的Expert級別評定,每個關卡結束后還可進入商店對主角和飛機進..."));list.add(new?Article(4,?"八神疾風",?"八神疾風(CV:植田佳奈)是日本動漫《魔法少女奈葉A's》首次登場的女角色。暗之書事件中心人物,時空管理局魔導師,擅長貝爾卡式廣域·遠程魔法。"));list.add(new?Article(5,?"逝去的疾風",?"大戰中飛得最快的日本飛機,恐怕要數“疾風”戰斗機了,它由中島飛機廠研制生產,制式型號為:?四式單(座)戰(斗機),代號キ-84(讀作?Ki-84)。"));list.add(new?Article(6,?"疾風劍豪?亞索",?"亞索是一個百折不屈的男人,還是一名身手敏捷的劍客,能夠運用風的力量來斬殺敵人。這位曾經春風得意的戰士因為誣告而身敗名裂,并且被迫卷入了一場令人絕望的生存之..."));list.add(new?Article(7,?"疾風知勁草",?"疾風知勁草,謂在猛烈的大風中,可看出什么樣的草是強勁的。比喻意志堅定,經得起考驗。出自《東觀漢記·王霸傳》:“上謂霸曰:‘潁川從我者皆逝,而子獨留,始驗疾風知勁草。..."));LuceneUtils.addAll(list);}/***?人工設置該document的得分*/@Testpublic?void?testAdd2()?throws?Exception{Article?article?=?new?Article(8,?"疾風知勁草",?"疾風知勁草,謂在猛烈的大風中,可看出什么樣的草是強勁的。比喻意志堅定,經得起考驗。出自《東觀漢記·王霸傳》:“上謂霸曰:‘潁川從我者皆逝,而子獨留,始驗疾風知勁草。...");Document?document?=?LuceneUtils.javabean2document(article);IndexWriter?indexWriter?=?new?IndexWriter(LuceneUtils.getDirectory(),?LuceneUtils.getAnalyzer(),?LuceneUtils.getMaxFieldLength());//人工設置該document的得分document.setBoost(100F);indexWriter.addDocument(document);indexWriter.close();}@Testpublic?void?testSearch()?throws?Exception{List<Article>?list?=?new?ArrayList<Article>();String?keyword?=?"疾風";QueryParser?queryParser?=?new?QueryParser(LuceneUtils.getVersion(),"content",?LuceneUtils.getAnalyzer());Query?query?=?queryParser.parse(keyword);IndexSearcher?indexSearcher?=?new?IndexSearcher(LuceneUtils.getDirectory());TopDocs?topDocs?=?indexSearcher.search(query,?10000);for(int?i=0;i<topDocs.scoreDocs.length;i++){ScoreDoc?scoreDoc?=?topDocs.scoreDocs[i];int?docIndex?=?scoreDoc.doc;Document?document?=?indexSearcher.doc(docIndex);System.out.println("編號為"+document.get("id")+"號的文章得分是"?+?scoreDoc.score);Article?article?=?LuceneUtils.document2javabean(document,?Article.class);list.add(article);}indexSearcher.close();for(Article?article?:?list){System.out.println(article);}} }輸出結果:
編號為8號的文章得分是31.94228 編號為1號的文章得分是0.33273208 編號為7號的文章得分是0.29114056 編號為4號的文章得分是0.23527712 編號為5號的文章得分是0.23527712 編號為2號的文章得分是0.20586747 編號為3號的文章得分是0.20586747 編號:?8 標題:?疾風知勁草 內容:?疾風知勁草,謂在猛烈的大風中,可看出什么樣的草是強勁的。比喻意志堅定,經得起考驗。出自《東觀漢記·王霸傳》:“上謂霸曰:‘潁川從我者皆逝,而子獨留,始驗疾風知勁草。... ------------------------------------------------------------------編號:?1 標題:?疾風之刃 內容:?《疾風之刃》是一款超動作3D動漫風網游。作為新一代動作游戲,《疾風之刃》呈現出極致華麗的動作表演,精心打磨出的打擊感震撼人心。 ------------------------------------------------------------------編號:?7 標題:?疾風知勁草 內容:?疾風知勁草,謂在猛烈的大風中,可看出什么樣的草是強勁的。比喻意志堅定,經得起考驗。出自《東觀漢記·王霸傳》:“上謂霸曰:‘潁川從我者皆逝,而子獨留,始驗疾風知勁草。... ------------------------------------------------------------------編號:?4 標題:?八神疾風 內容:?八神疾風(CV:植田佳奈)是日本動漫《魔法少女奈葉A's》首次登場的女角色。暗之書事件中心人物,時空管理局魔導師,擅長貝爾卡式廣域·遠程魔法。 ------------------------------------------------------------------編號:?5 標題:?逝去的疾風 內容:?大戰中飛得最快的日本飛機,恐怕要數“疾風”戰斗機了,它由中島飛機廠研制生產,制式型號為:?四式單(座)戰(斗機),代號キ-84(讀作?Ki-84)。 ------------------------------------------------------------------編號:?2 標題:?月光疾風 內容:?月光疾風,日本動漫《火影忍者》中的人物,比較個人主義,性格溫和。火之國木葉村的特別上忍,中忍考試正賽預選的考官,體質似乎很不好,有著嚴重的黑眼圈、臉色蒼白且經常咳嗽,善用劍術。 ------------------------------------------------------------------編號:?3 標題:?疾風航班中文版下載 內容:?《疾風航班》是一款優質的動作模擬游戲。游戲中包括亞歐美洲,乃至飛往太空的5條航線,共計50個循序漸進的關卡,以及具有挑戰性的Expert級別評定,每個關卡結束后還可進入商店對主角和飛機進... ------------------------------------------------------------------5、Lucene中按單個字段和多個字段排序
(1)按單個字段排序
Sort?sort?=?new?Sort(new?SortField("id",SortField.INT,true)); TopDocs?topDocs?=?indexSearcher.search(query,null,1000000,sort);(2)按多個字段排序
Sort?sort?=?new?Sort(new?SortField("count",SortField.INT,true),new?SortField("id",SortField.INT,true)); TopDocs?topDocs?=?indexSearcher.search(query,null,1000000,sort);?在多字段排序中,只有第一個字段排序結果相同時,第二個字段排序才有作用(提倡用數值型排序)
TestSort2.java
LuceneUtils.java
package?com.rk.lucene.utils;import?java.io.File; import?java.io.IOException; import?java.lang.reflect.Method; import?java.util.ArrayList; import?java.util.List;import?org.apache.commons.beanutils.BeanUtils; import?org.apache.lucene.analysis.Analyzer; import?org.apache.lucene.analysis.standard.StandardAnalyzer; import?org.apache.lucene.document.Document; import?org.apache.lucene.document.Field; import?org.apache.lucene.document.Field.Index; import?org.apache.lucene.document.Field.Store; import?org.apache.lucene.index.IndexWriter; import?org.apache.lucene.index.Term; import?org.apache.lucene.index.IndexWriter.MaxFieldLength; import?org.apache.lucene.queryParser.QueryParser; import?org.apache.lucene.search.IndexSearcher; import?org.apache.lucene.search.Query; import?org.apache.lucene.search.ScoreDoc; import?org.apache.lucene.search.TopDocs; import?org.apache.lucene.store.Directory; import?org.apache.lucene.store.FSDirectory; import?org.apache.lucene.util.Version;import?com.rk.lucene.entity.Page;public?class?LuceneUtils?{private?static?Directory?directory;private?static?Version?version;private?static?Analyzer?analyzer;private?static?MaxFieldLength?maxFieldLength;private?static?final?String?LUCENE_DIRECTORY=?"D:/rk/indexDB";static{try?{directory?=?FSDirectory.open(new?File(LUCENE_DIRECTORY));version?=?Version.LUCENE_30;analyzer?=?new?StandardAnalyzer(version);maxFieldLength?=?MaxFieldLength.LIMITED;}?catch?(Exception?e)?{e.printStackTrace();throw?new?RuntimeException(e);}}//不讓外部new當前幫助類的對象private?LuceneUtils(){}public?static?<T>?void?pagination(Page<T>?page,String?field,String?keyword,Class<T>?clazz)?throws?Exception{QueryParser?queryParser?=?new?QueryParser(getVersion(),?field,?getAnalyzer());?Query?query?=?queryParser.parse(keyword);IndexSearcher?indexSearcher?=?new?IndexSearcher(getDirectory());TopDocs?topDocs?=?indexSearcher.search(query,?200);int?totalHits?=?topDocs.totalHits;int?curPage?=?page.getCurPage();int?pageSize?=?page.getPageSize();int?quotient?=?totalHits?/?pageSize;int?remainder?=?totalHits?%?pageSize;int?totalPages?=?remainder==0???quotient?:?quotient+1;int?startIndex?=?(curPage-1)?*?pageSize;int?stopIndex?=?Math.min(startIndex?+?pageSize,?totalHits);List<T>?list?=?page.getItems();if(list?==?null){list?=?new?ArrayList<T>();page.setItems(list);}list.clear();for(int?i=startIndex;i<stopIndex;i++){ScoreDoc?scoreDoc?=?topDocs.scoreDocs[i];int?docIndex?=?scoreDoc.doc;Document?document?=?indexSearcher.doc(docIndex);T?t?=?document2javabean(document,?clazz);list.add(t);}page.setTotalPages(totalPages);page.setTotalItems(totalHits);indexSearcher.close();}public?static?<T>?void?add(T?t)?throws?Exception{Document?document?=?javabean2document(t);IndexWriter?indexWriter?=?new?IndexWriter(getDirectory(),?getAnalyzer(),?getMaxFieldLength());indexWriter.addDocument(document);indexWriter.close();}public?static?<T>?void?addAll(List<T>?list)?throws?Exception{IndexWriter?indexWriter?=?new?IndexWriter(getDirectory(),?getAnalyzer(),?getMaxFieldLength());for(T?t?:?list){Document?doc?=?javabean2document(t);indexWriter.addDocument(doc);}indexWriter.close();}public?static?<T>?void?update(String?field,String?value,T?t)?throws?Exception{Document?document?=?javabean2document(t);IndexWriter?indexWriter?=?new?IndexWriter(getDirectory(),?getAnalyzer(),?getMaxFieldLength());indexWriter.updateDocument(new?Term(field,value),?document);indexWriter.close();}public?static?<T>?void?delete(String?field,String?value)?throws?Exception{IndexWriter?indexWriter?=?new?IndexWriter(getDirectory(),?getAnalyzer(),?getMaxFieldLength());indexWriter.deleteDocuments(new?Term(field,value));indexWriter.close();}/***?刪除所有記錄*/public?static?void?deleteAll()?throws?Exception?{IndexWriter?indexWriter?=?new?IndexWriter(getDirectory(),?getAnalyzer(),?getMaxFieldLength());indexWriter.deleteAll();indexWriter.close();}/***?根據關鍵字進行搜索*/public?static?<T>?List<T>?search(String?field,String?keyword,int?topN,Class<T>?clazz)?throws?Exception{List<T>?list?=?new?ArrayList<T>();QueryParser?queryParser?=?new?QueryParser(getVersion(),?field,?getAnalyzer());Query?query?=?queryParser.parse(keyword);IndexSearcher?indexSearcher?=?new?IndexSearcher(getDirectory());TopDocs?topDocs?=?indexSearcher.search(query,?topN);for(int?i=0;i<topDocs.scoreDocs.length;i++){ScoreDoc?scoreDoc?=?topDocs.scoreDocs[i];int?docIndex?=?scoreDoc.doc;System.out.println("文檔索引號"?+?docIndex?+?",文檔得分:"?+?scoreDoc.score);Document?document?=?indexSearcher.doc(docIndex);T?entity?=?(T)?document2javabean(document,?clazz);list.add(entity);}indexSearcher.close();return?list;}/***?打印List*/public?static?<T>?void?printList(List<T>?list){if(list?!=?null?&&?list.size()>0){for(T?t?:?list){System.out.println(t);}}}//將JavaBean轉成Document對象public?static?Document?javabean2document(Object?obj)?throws?Exception{//創建Document對象Document?document?=?new?Document();//獲取obj引用的對象字節碼Class?clazz?=?obj.getClass();//通過對象字節碼獲取私有的屬性java.lang.reflect.Field[]?reflectFields?=?clazz.getDeclaredFields();//迭代for(java.lang.reflect.Field?reflectField?:?reflectFields){//反射reflectField.setAccessible(true);//獲取字段名String?name?=?reflectField.getName();//獲取字段值String?value?=?reflectField.get(obj).toString();//加入到Document對象中去,這時javabean的屬性與document對象的屬性相同document.add(new?Field(name,?value,?Store.YES,?Index.ANALYZED));}//返回document對象return?document;}//將Document對象轉換成JavaBean對象public?static?<T>?T?document2javabean(Document?document,Class<T>?clazz)?throws?Exception{T?obj?=?clazz.newInstance();java.lang.reflect.Field[]?reflectFields?=?clazz.getDeclaredFields();for(java.lang.reflect.Field?reflectField?:?reflectFields){reflectField.setAccessible(true);String?name?=?reflectField.getName();String?value?=?document.get(name);BeanUtils.setProperty(obj,?name,?value);}return?obj;}public?static?Directory?getDirectory()?{return?directory;}public?static?void?setDirectory(Directory?directory)?{LuceneUtils.directory?=?directory;}public?static?Version?getVersion()?{return?version;}public?static?void?setVersion(Version?version)?{LuceneUtils.version?=?version;}public?static?Analyzer?getAnalyzer()?{return?analyzer;}public?static?void?setAnalyzer(Analyzer?analyzer)?{LuceneUtils.analyzer?=?analyzer;}public?static?MaxFieldLength?getMaxFieldLength()?{return?maxFieldLength;}public?static?void?setMaxFieldLength(MaxFieldLength?maxFieldLength)?{LuceneUtils.maxFieldLength?=?maxFieldLength;}}轉載于:https://blog.51cto.com/lsieun/1852886
總結
以上是生活随笔為你收集整理的Lucene系列:(9)搜索结果排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用卡挂失 信用卡如何挂失
- 下一篇: Mac平台上OpenCV开发环境搭建