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

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.Sort;
import org.apache.lucene.search.SortField;
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 TestSort2 {@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);}@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);//创建排序对象//参数一:id表示依据document对象中的哪个字段排序,例如:id//参数二:SortField.INT表示document对象中该字段的类型,以常量方式书写//参数三:true表示降序,类似于order by id desc//参数三:false表示升序,类似于order by id asc//Sort sort = new Sort(new SortField("id", SortField.INT, false));//单个字段排序//TopDocs topDocs = indexSearcher.search(query, null, 10000, sort);//多个字段排序:先按content的内容得分排序,再按id的降序排序Sort sort = new Sort(new SortField("content", SortField.SCORE, false),new SortField("id", SortField.INT, true));TopDocs topDocs = indexSearcher.search(query, null, 10000, sort);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);}}
}

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)搜索结果排序相关推荐

  1. Lucene系列七:搜索过程和IndexSearcher

    搜索过程是由Lucene所提供的核心功能之一.下图说明了搜索过程和使用的类. IndexSearcher是搜索过程中最重要的和核心组件.本章的需要掌握的,了解他们的存储原理后就可以方便知道如何基于这些 ...

  2. #研发解决方案介绍#基于ES的搜索+筛选+排序解决方案

    郑昀 基于胡耀华和王超的设计文档 最后更新于2014/12/3 关键词:ElasticSearch.Lucene.solr.搜索.facet.高可用.可伸缩.mongodb.SearchHub.商品中 ...

  3. Lucene系列之全局搜索引擎入门教程

    Lucene简介 Lucent:Apache软件基金会Jakarta项目组的一个子项目,Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻.在Java开发环境里Lucene是一个成熟 ...

  4. 2021年大数据ELK(四):Lucene的美文搜索案例

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 美文搜索案例 一.需求 二.准备工作 1.创建IDEA项目 2. ...

  5. 基于 Lucene 的桌面文件搜索

    开源2010年,自己在学习 Lucene 时开发的一款桌面文件搜索工具,这么多年过去了,代码一直静静存放在自己的硬盘上,与其让其沉睡,不如分享出来. 这款工具带有明显的模仿 Everything 的痕 ...

  6. 【AI in 美团】深度学习在美团搜索广告排序的应用实践

    转自:https://mp.weixin.qq.com/s/9Fcj5lO-JPfFVnRSSM_56w [AI in 美团]深度学习在美团搜索广告排序的应用实践 AI(人工智能)技术已经广泛应用于美 ...

  7. LeetCode高频题33. 搜索旋转排序数组

    LeetCode高频题33. 搜索旋转排序数组 提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目 互联网大厂们在公司养了一大批A ...

  8. Lucene系列(一)什么是Lucene

    前言 上一个系列还没有完结,我又来开新坑啦- 接触搜索/推荐相关工作,也有两年了.工作里对lucene的接触不少,却也不精.最近工作里没有那么忙,因此想通过学习源码的方式,来对lucene进行一个系统 ...

  9. 阿里提出电商搜索全局排序方法,淘宝无线主搜GMV提升5%

    作者 | 瑞溪 编辑 | Vincent AI 前线导读:AI 前线本周带来第 35 篇论文解读,本期要解读的论文来自阿里巴巴,主题是:电商搜索全局排序方法.一个好的排序算法可以为电商带来销量的巨大提 ...

最新文章

  1. Maven构建Struts2项目
  2. MySQL修改字段名、字段类型
  3. SpringBoot自动配置实现原理及源码解析(2.3.x)
  4. options请求_跨域共享资源(CORS)和OPTIONS 请求
  5. Java代码优化的35个细节,你用了吗?
  6. GCC编译器的使用方法
  7. android 调用系统图片编辑,android 调用系统 裁剪 图片
  8. 图书销售系统 php,php文学小说销售系统
  9. OpenCV+百度云人脸识别项目及源码
  10. i5 12500H性能怎么样 相当于什么水平
  11. 华为机试--字符串ASC码+偏移量实现加密
  12. 《西游记》中唐僧团队
  13. 一篇文章带你了解新能源汽车整车控制器VCU 硬件在环(HiL)仿真测试方案
  14. [GYCTF2020]Blacklist 1
  15. less和more的区别
  16. NOJ-11:忠诚的骑士
  17. java编译体重指数计算器_标准体重计算器
  18. CNZZ 统计代码及作弊分析
  19. java/php/net/python幼儿早教管理系统设计
  20. umc18mmrf安装,CDB转OA,使用Cadence VIrtuoso进行芯片设计

热门文章

  1. IPSEC非单播流量处理
  2. 给 OpenPOP.Net 加一个小功能,可用于收取邮件时监测数据流量!
  3. 查看、修改linux系统的最大链接数限制、文件描述符限制、端口范围限制、虚拟内存等...
  4. Lesson 03:运算符与流程控制
  5. 内置函数(面向对象)
  6. [原创]OpenvSwitch安装
  7. 《jQuery知识点总结》(一)
  8. JS_鼠标移入移出渐变效果(类似css3中的transition或animation和@keyframes)
  9. JavaScript 流程控制语句
  10. zen cart如何给新产品、特价、推荐产品页面加标题、关键字、描述