热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Lucene4.4.0开发之排序

排序是对于全文检索来言是一个必不可少的功能,在实际运用中,排序功能能在某些时候给我们带来很大的方便,比如在淘宝,京东等一些电商网站我们可能通过排序来快速找到价格最便宜的商品,或者通过排序来找到评论数最

排序是对于全文检索来言是一个必不可少的功能,在实际运用中,排序功能能在某些时候给我们带来很大的方便,比如在淘宝,京东等一些电商网站我们可能通过排序来快速找到价格最便宜的商品,或者通过排序来找到评论数最高或卖的最好的商品,再比如在Iteye里的博客栏里,每天都会以降序的方式,来显示出最新发出的几篇博客,有了排序,我们就能在某些时候很方便快速的得到某些有效信息,所以说排序功能,无处不在 ^_^。

  那么,本篇就来看下我们在Lucene中怎么使用其丰富的排序功能。

  在这之前,我们先来熟悉下lucene中排序的基本知识,在默认情况下,Lucene使用的是以关联性降序的方式为默认的排序方式,这样可以使得我们搜索的结果通常是最优的,因为它会尽可能的使得首先出现的几个结果是与我们搜索的内容最相关,而不需要我们翻页寻找我们最想要的内容,这一点是与数据库相比,是全文检索一个很大的优点。当然,在实际开发中我们也需要根据业务的实际情况来给我们的客户提供多种不同的排序方式。我们先来看下在Lucene中比较特殊的两种基本的排序方式


  
Sort里的属性 SortField里的属性 含义  
Sort.INDEXORDER SortField.FIELD_DOC 按照索引的顺序进行排序  
Sort.RELEVANCE SortField.FIELD_SCORE 按照关联性评分进行排序


  我们再来看几个检索时需要用的方法

  Java代码

  =========SortField类============

  //field是排序字段type是排序类型

  public SortField(String field, Type type);

  //field是排序字段type是排序类型reverse是指定升序还是降序

  //reverse 为true是降序 false为升序

  public SortField(String field, Type type, boolean reverse)

  =========Sort类============

  public Sort();//Sort对象构造方法默认是按文档评分排序

  public Sort(SortField field);//排序的一个SortField

  public Sort(SortField... fields)//排序的多个SortField可以传入一个数组

  =========IndexSearche类r========

  //query是查询的Query对象 filter是过滤 n返回的数量 sort是排序

  search(Query query, Filter filter, int n, Sort sort)

  //doDocScores 为true情况下每个命中的结果下都会被评分

  //doMaxScore 为true情况下对最大分值的搜索结果进行评分

  search(Query query, Filter filter, int n, Sort sort, boolean doDocScores, boolean doMaxScore)

  =========SortField类============

  //field是排序字段type是排序类型

  public SortField(String field, Type type);

  //field是排序字段type是排序类型reverse是指定升序还是降序

  //reverse 为true是降序 false为升序

  public SortField(String field, Type type, boolean reverse)

  =========Sort类============

  public Sort();//Sort对象构造方法默认是按文档评分排序

  public Sort(SortField field);//排序的一个SortField

  public Sort(SortField... fields)//排序的多个SortField可以传入一个数组

  =========IndexSearche类r========

  //query是查询的Query对象 filter是过滤 n返回的数量 sort是排序

  search(Query query, Filter filter, int n, Sort sort)

  //doDocScores 为true情况下每个命中的结果下都会被评分

  //doMaxScore 为true情况下对最大分值的搜索结果进行评分

  search(Query query, Filter filter, int n, Sort sort, boolean doDocScores, boolean doMaxScore)

  1,在还没有进行一点排序前我们先来看下索引里的内容,核心代码如下:

  Java代码

  TopDocs topDocs=searcher.search(new MatchAllDocsQuery(),10000);

  TopDocs topDocs=searcher.search(new MatchAllDocsQuery(),10000);


  2,使用默认的关联性评分后,核心代码和运行效果图如下:

  Java代码

  Sort sort=new Sort();//默认使用关联性评分

  TopDocs topDocs=searcher.search(new MatchAllDocsQuery(),10000,sort);

  Sort sort=new Sort();//默认使用关联性评分

  TopDocs topDocs=searcher.search(new MatchAllDocsQuery(),10000,sort);


  关于上图中乱码字符原因是因为默认排序情况下lucene是不会对搜索结果进行评分操作的,因为评分操作会降低性能,所以关于score的那一列返回的是NAN的字符串,出于格式的需要,散仙在用DecimalFormat类给其评分结果保留2位小数时,因为是一个特殊字符,所以就出现了上图情况。

3,按照日期降序排序,,核心代码和运行效果图如下:

  Java代码

  Sort sort=new Sort(new SortField("date", Type.INT,true));//true为降序排列

  TopDocs topDocs=searcher.search(new MatchAllDocsQuery(),10000,sort);

  Sort sort=new Sort(new SortField("date", Type.INT,true));//true为降序排列

  TopDocs topDocs=searcher.search(new MatchAllDocsQuery(),10000,sort);


  3,按照价格升序排序,,核心代码和运行效果图如下:

  Java代码

  Sort sort=new Sort(new SortField("price", Type.DOUBLE,false));//false为降序排列

  TopDocs topDocs=searcher.search(new MatchAllDocsQuery(),10000,sort);

  Sort sort=new Sort(new SortField("price", Type.DOUBLE,false));//false为降序排列

  TopDocs topDocs=searcher.search(new MatchAllDocsQuery(),10000,sort);


  4,多字段排序,按照日期降序的情况下,因为id为7和8的日期相同,所以我们就新增一个排序字段按ename升序排列,,核心代码和运行效果图如下:

  Java代码

  // Sort sort=new Sort(new SortField("date", Type.INT, true),new SortField("ename", Type.STRING, false));

  //这两段代码效果一样

  Sort sort=new Sort(new SortField[]{new SortField("date", Type.INT, true),new SortField("ename", Type.STRING, false)});

  TopDocs topDocs=searcher.search(new MatchAllDocsQuery(),10000,sort);

  // Sort sort=new Sort(new SortField("date", Type.INT, true),new SortField("ename", Type.STRING, false));

  //这两段代码效果一样

  Sort sort=new Sort(new SortField[]{new SortField("date", Type.INT, true),new SortField("ename", Type.STRING, false)});

  TopDocs topDocs=searcher.search(new MatchAllDocsQuery(),10000,sort);


  5,带评分的排序,注意后面两个布尔类型的变量可以控制是否评分,特别是在没有要求需要打分时,建议别开启,大数量时对性能影响较大,检索“编程”得到的结果,默认按评分降序排序,核心代码和运行效果图如下:

  Java代码

  Sort sort=Sort.RELEVANCE;

  TopDocs topDocs=searcher.search(new TermQuery(new Term("bookname", "编程")),null,100,sort,true,true);

  Sort sort=Sort.RELEVANCE;

  TopDocs topDocs=searcher.search(new TermQuery(new Term("bookname", "编程")),null,100,sort,true,true);


  上面的编程,编程因为在切分时编程的tf出现了2次,所以在查询时有较高的得分,所以排在首位。

  6,注意几点 
(1)排序对一个文档里什么域都没存储,使用字符串排序会排在首位 
(2)排序对一个文档里什么域都没存储,使用数字类型排序会默认给其赋值为0进行排序 
(3)我们可以对数字类型的null值的文档进行代码控制,可以将其设置为最大,所以将会排在最后面,代码如下


  SortField sortField = new SortField("value", SortField.Type.INT);

  sortField.setMissingValue(Integer.MAX_VALUE);

 

比较有用的地址:

http://iamyida.iteye.com/category/335240

http://m635674608.iteye.com/blog/2234612


推荐阅读
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 初探PLC 的ST 语言转换成C++ 的方法
    自动控制软件绕不开ST(StructureText)语言。它是IEC61131-3标准中唯一的一个高级语言。目前,大多数PLC产品支持ST ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • 第8章 使用外部和内部链接
    8.1使用web地址LearnAboutafricanelephants. ... [详细]
  • angular.element使用方法及总结
    2019独角兽企业重金招聘Python工程师标准在线查询:http:each.sinaapp.comangularapielement.html使用方法 ... [详细]
  • Vue基础一、什么是Vue1.1概念Vue(读音vjuː,类似于view)是一套用于构建用户界面的渐进式JavaScript框架,与其它大型框架不 ... [详细]
  • ①页面初始化----------收到客户端的请求,产生相应页面的Page对象,通过Page_Init事件进行page对象及其控件的初始化.②加载视图状态-------ViewSta ... [详细]
author-avatar
时尚经典语录覀---
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有