Lucene系列:(9)搜索结果排序
生活随笔
收集整理的這篇文章主要介紹了
Lucene系列:(9)搜索结果排序
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1、什么是搜索結(jié)果排序
? ? 搜索結(jié)果是按某個(gè)或某些字段高低排序來顯示的結(jié)果
2、影響網(wǎng)站排名的多種因素
? ? ?head/meta/
? ? ?網(wǎng)頁的標(biāo)簽整潔
? ? ?網(wǎng)頁執(zhí)行速度
? ? ?采用div+css
? ? ?。。。。。。
3、Lucene中的顯示結(jié)果次序與相關(guān)度得分有關(guān)
????ScoreDoc.score;? ? 默認(rèn)情況下,Lucene是按相關(guān)度得分排序的,得分高排在前,得分低排在后
? ? 如果相關(guān)度得分相同,按插入索引庫的先后次序排序
4、Lucene中的手工設(shè)置相關(guān)度得分
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;/***?在默認(rèn)情況下,Lucene是按照相關(guān)度得份排序的*/ public?class?TestSort?{@Testpublic?void?testAdd()?throws?Exception{List<Article>?list?=?new?ArrayList<Article>();list.add(new?Article(1,?"疾風(fēng)之刃",?"《疾風(fēng)之刃》是一款超動作3D動漫風(fēng)網(wǎng)游。作為新一代動作游戲,《疾風(fēng)之刃》呈現(xiàn)出極致華麗的動作表演,精心打磨出的打擊感震撼人心。"));list.add(new?Article(2,?"月光疾風(fēng)",?"月光疾風(fēng),日本動漫《火影忍者》中的人物,比較個(gè)人主義,性格溫和。火之國木葉村的特別上忍,中忍考試正賽預(yù)選的考官,體質(zhì)似乎很不好,有著嚴(yán)重的黑眼圈、臉色蒼白且經(jīng)常咳嗽,善用劍術(shù)。"));list.add(new?Article(3,?"疾風(fēng)航班中文版下載",?"《疾風(fēng)航班》是一款優(yōu)質(zhì)的動作模擬游戲。游戲中包括亞歐美洲,乃至飛往太空的5條航線,共計(jì)50個(gè)循序漸進(jìn)的關(guān)卡,以及具有挑戰(zhàn)性的Expert級別評定,每個(gè)關(guān)卡結(jié)束后還可進(jìn)入商店對主角和飛機(jī)進(jìn)..."));list.add(new?Article(4,?"八神疾風(fēng)",?"八神疾風(fēng)(CV:植田佳奈)是日本動漫《魔法少女奈葉A's》首次登場的女角色。暗之書事件中心人物,時(shí)空管理局魔導(dǎo)師,擅長貝爾卡式廣域·遠(yuǎn)程魔法。"));list.add(new?Article(5,?"逝去的疾風(fēng)",?"大戰(zhàn)中飛得最快的日本飛機(jī),恐怕要數(shù)“疾風(fēng)”戰(zhàn)斗機(jī)了,它由中島飛機(jī)廠研制生產(chǎn),制式型號為:?四式單(座)戰(zhàn)(斗機(jī)),代號キ-84(讀作?Ki-84)。"));list.add(new?Article(6,?"疾風(fēng)劍豪?亞索",?"亞索是一個(gè)百折不屈的男人,還是一名身手敏捷的劍客,能夠運(yùn)用風(fēng)的力量來斬殺敵人。這位曾經(jīng)春風(fēng)得意的戰(zhàn)士因?yàn)檎_告而身敗名裂,并且被迫卷入了一場令人絕望的生存之..."));list.add(new?Article(7,?"疾風(fēng)知勁草",?"疾風(fēng)知勁草,謂在猛烈的大風(fēng)中,可看出什么樣的草是強(qiáng)勁的。比喻意志堅(jiān)定,經(jīng)得起考驗(yàn)。出自《東觀漢記·王霸傳》:“上謂霸曰:‘潁川從我者皆逝,而子獨(dú)留,始驗(yàn)疾風(fēng)知勁草。..."));LuceneUtils.addAll(list);}/***?人工設(shè)置該document的得分*/@Testpublic?void?testAdd2()?throws?Exception{Article?article?=?new?Article(8,?"疾風(fēng)知勁草",?"疾風(fēng)知勁草,謂在猛烈的大風(fēng)中,可看出什么樣的草是強(qiáng)勁的。比喻意志堅(jiān)定,經(jīng)得起考驗(yàn)。出自《東觀漢記·王霸傳》:“上謂霸曰:‘潁川從我者皆逝,而子獨(dú)留,始驗(yàn)疾風(fēng)知勁草。...");Document?document?=?LuceneUtils.javabean2document(article);IndexWriter?indexWriter?=?new?IndexWriter(LuceneUtils.getDirectory(),?LuceneUtils.getAnalyzer(),?LuceneUtils.getMaxFieldLength());//人工設(shè)置該document的得分document.setBoost(100F);indexWriter.addDocument(document);indexWriter.close();}@Testpublic?void?testSearch()?throws?Exception{List<Article>?list?=?new?ArrayList<Article>();String?keyword?=?"疾風(fēng)";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);}} }輸出結(jié)果:
編號為8號的文章得分是31.94228 編號為1號的文章得分是0.33273208 編號為7號的文章得分是0.29114056 編號為4號的文章得分是0.23527712 編號為5號的文章得分是0.23527712 編號為2號的文章得分是0.20586747 編號為3號的文章得分是0.20586747 編號:?8 標(biāo)題:?疾風(fēng)知勁草 內(nèi)容:?疾風(fēng)知勁草,謂在猛烈的大風(fēng)中,可看出什么樣的草是強(qiáng)勁的。比喻意志堅(jiān)定,經(jīng)得起考驗(yàn)。出自《東觀漢記·王霸傳》:“上謂霸曰:‘潁川從我者皆逝,而子獨(dú)留,始驗(yàn)疾風(fēng)知勁草。... ------------------------------------------------------------------編號:?1 標(biāo)題:?疾風(fēng)之刃 內(nèi)容:?《疾風(fēng)之刃》是一款超動作3D動漫風(fēng)網(wǎng)游。作為新一代動作游戲,《疾風(fēng)之刃》呈現(xiàn)出極致華麗的動作表演,精心打磨出的打擊感震撼人心。 ------------------------------------------------------------------編號:?7 標(biāo)題:?疾風(fēng)知勁草 內(nèi)容:?疾風(fēng)知勁草,謂在猛烈的大風(fēng)中,可看出什么樣的草是強(qiáng)勁的。比喻意志堅(jiān)定,經(jīng)得起考驗(yàn)。出自《東觀漢記·王霸傳》:“上謂霸曰:‘潁川從我者皆逝,而子獨(dú)留,始驗(yàn)疾風(fēng)知勁草。... ------------------------------------------------------------------編號:?4 標(biāo)題:?八神疾風(fēng) 內(nèi)容:?八神疾風(fēng)(CV:植田佳奈)是日本動漫《魔法少女奈葉A's》首次登場的女角色。暗之書事件中心人物,時(shí)空管理局魔導(dǎo)師,擅長貝爾卡式廣域·遠(yuǎn)程魔法。 ------------------------------------------------------------------編號:?5 標(biāo)題:?逝去的疾風(fēng) 內(nèi)容:?大戰(zhàn)中飛得最快的日本飛機(jī),恐怕要數(shù)“疾風(fēng)”戰(zhàn)斗機(jī)了,它由中島飛機(jī)廠研制生產(chǎn),制式型號為:?四式單(座)戰(zhàn)(斗機(jī)),代號キ-84(讀作?Ki-84)。 ------------------------------------------------------------------編號:?2 標(biāo)題:?月光疾風(fēng) 內(nèi)容:?月光疾風(fēng),日本動漫《火影忍者》中的人物,比較個(gè)人主義,性格溫和。火之國木葉村的特別上忍,中忍考試正賽預(yù)選的考官,體質(zhì)似乎很不好,有著嚴(yán)重的黑眼圈、臉色蒼白且經(jīng)常咳嗽,善用劍術(shù)。 ------------------------------------------------------------------編號:?3 標(biāo)題:?疾風(fēng)航班中文版下載 內(nèi)容:?《疾風(fēng)航班》是一款優(yōu)質(zhì)的動作模擬游戲。游戲中包括亞歐美洲,乃至飛往太空的5條航線,共計(jì)50個(gè)循序漸進(jìn)的關(guān)卡,以及具有挑戰(zhàn)性的Expert級別評定,每個(gè)關(guān)卡結(jié)束后還可進(jìn)入商店對主角和飛機(jī)進(jìn)... ------------------------------------------------------------------5、Lucene中按單個(gè)字段和多個(gè)字段排序
(1)按單個(gè)字段排序
Sort?sort?=?new?Sort(new?SortField("id",SortField.INT,true)); TopDocs?topDocs?=?indexSearcher.search(query,null,1000000,sort);(2)按多個(gè)字段排序
Sort?sort?=?new?Sort(new?SortField("count",SortField.INT,true),new?SortField("id",SortField.INT,true)); TopDocs?topDocs?=?indexSearcher.search(query,null,1000000,sort);?在多字段排序中,只有第一個(gè)字段排序結(jié)果相同時(shí),第二個(gè)字段排序才有作用(提倡用數(shù)值型排序)
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當(dāng)前幫助類的對象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();}/***?根據(jù)關(guān)鍵字進(jìn)行搜索*/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轉(zhuǎn)成Document對象public?static?Document?javabean2document(Object?obj)?throws?Exception{//創(chuàng)建Document對象Document?document?=?new?Document();//獲取obj引用的對象字節(jié)碼Class?clazz?=?obj.getClass();//通過對象字節(jié)碼獲取私有的屬性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對象中去,這時(shí)javabean的屬性與document對象的屬性相同document.add(new?Field(name,?value,?Store.YES,?Index.ANALYZED));}//返回document對象return?document;}//將Document對象轉(zhuǎn)換成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;}}轉(zhuǎn)載于:https://blog.51cto.com/lsieun/1852886
總結(jié)
以上是生活随笔為你收集整理的Lucene系列:(9)搜索结果排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用卡挂失 信用卡如何挂失
- 下一篇: 如何查询公积金余额 公积金余额怎么查询