Spring Data Solr教程:排序

当我们实现单词搜索功能时,我们通常希望通过使用每个搜索结果的相关性以降序对搜索结果进行排序。 这也是Solr的默认行为。

但是,在某些情况下,有必要手动指定排序顺序。 一种此类情况是“常规”搜索功能的实现,该功能已在我的Spring Data Solr教程的上一部分中进行了讨论。

这篇博客文章描述了如何使用Spring Data Solr对查询结果进行排序。 更具体地说,我们必须修改示例应用程序的搜索功能,以通过使用id字段的值将搜索结果降序排列。

此博客文章分为三个部分:

  • 第一部分描述了如何指定查询中使用的排序选项。
  • 第二部分描述了在使用查询方法构建查询时如何对查询结果进行排序。
  • 第三部分教我们如何对动态查询的查询结果进行排序。

让我们开始吧。

注意:这些博客文章提供了其他信息,可帮助我们理解此博客文章中描述的概念:

  • 使用Maven运行Solr
  • Spring Data Solr教程:Solr简介
  • Spring Data Solr教程:配置
  • Spring Data Solr教程CRUD(几乎)
  • Spring Data Solr教程:将自定义方法添加到单个存储库
  • Spring Data Solr教程:动态查询

指定查询的排序选项

查询的排序选项是使用Sort类指定的。 下面给出了对查询结果进行排序的典型要求:

  • 通过使用单个字段的值对查询结果进行排序。
  • 当不同字段的排序顺序相同时,通过使用多个字段的值对查询结果进行排序。
  • 当不同字段的排序顺序不同时,通过使用多个字段的值对查询结果进行排序。

让我们看一下如何创建一个满足给定要求的Sort对象。

首先,我们必须创建一个Sort对象,该对象指定使用单个字段对查询结果进行排序。 假设我们要使用id字段按升序对查询结果进行排序。 我们可以使用以下代码创建Sort对象:

new Sort(Sort.Direction.ASC, "id")

其次,我们必须创建一个Sort对象,该对象声明当不同字段的排序顺序相同时,使用多个字段的值对查询结果进行排序。 假设我们必须使用iddescription字段对查询结果进行降序排序。 我们可以使用以下代码创建Sort对象:

new Sort(Sort.Direction.DESC, "id", "description")

第三,当不同字段的排序顺序不同时,我们想使用多个字段的值对查询结果进行排序。 假设我们要使用描述字段以降序对查询结果进行排序,并使用id字段以升序对查询结果进行排序。 我们可以使用以下代码创建Sort对象:

new Sort(Sort.Direction.DESC, "description").and(new Sort(Sort.Direction.ASC, "id"))

现在我们知道如何创建新的Sort对象。 让我们继续实践该理论。

对查询方法的查询结果进行排序

使用查询方法构建查询时,可以按照以下步骤对查询结果进行排序:

  1. 将新的Sort参数添加到查询方法。 此方法参数指定使用的排序选项。
  2. 在服务层中创建一个新的Sort对象,并在调用查询方法时将其作为方法参数传递。

让我们继续前进,找出实现方法。

修改存储库界面

通过将新的Sort参数添加到我们的查询方法中,我们可以对查询的查询结果进行排序 。 此方法参数指定执行的查询的排序选项。 让我们继续看一下查询方法的声明。

从方法名称查询生成

通过使用从方法名策略生成查询来创建执行的查询时,我们必须在TodoDocumentRepository接口的findByTitleContainsOrDescriptionContains()方法中添加一个Sort参数。 我们的存储库界面的源代码如下所示:

import org.springframework.data.domain.Sort;
import org.springframework.data.solr.repository.Query;
import org.springframework.data.solr.repository.SolrCrudRepository;import java.util.List;public interface TodoDocumentRepository extends PartialUpdateRepository, SolrCrudRepository<TodoDocument, String> {public List<TodoDocument> findByTitleContainsOrDescriptionContains(String title, String description, Sort sort);
}

命名查询

当使用命名查询创建执行的查询时,我们必须在TodoDocumentRepository接口的findByNamedQuery()方法中添加一个Sort参数。 我们的存储库界面的源代码如下所示:

import org.springframework.data.domain.Sort;
import org.springframework.data.solr.repository.Query;
import org.springframework.data.solr.repository.SolrCrudRepository;import java.util.List;public interface TodoDocumentRepository extends PartialUpdateRepository, SolrCrudRepository<TodoDocument, String> {@Query(name = "TodoDocument.findByNamedQuery")public List<TodoDocument> findByNamedQuery(String searchTerm, Sort sort);
}

注意:如果由于已知的bug,我们在使用Spring Data Solr RC1时,这种方法不起作用。 我们要么使用构建快照依赖项,要么等待RC2的发布。

@Query注释

使用@Query批注创建执行的查询时,我们必须在TodoDocumentRepository接口的findByQueryAnnotation()方法中添加一个Sort参数。 我们的存储库界面的源代码如下所示:

import org.springframework.data.domain.Sort;
import org.springframework.data.solr.repository.Query;
import org.springframework.data.solr.repository.SolrCrudRepository;import java.util.List;public interface TodoDocumentRepository extends PartialUpdateRepository, SolrCrudRepository<TodoDocument, String> {@Query("title:*?0* OR description:*?0*")public List<TodoDocument> findByQueryAnnotation(String searchTerm, Sort sort);
}

注意:如果由于已知的bug,我们在使用Spring Data Solr RC1时,这种方法不起作用。 我们要么使用构建快照依赖项,要么等待RC2的发布。

使用查询方法

我们可以通过对RepositoryIndexService类的search()方法进行以下更改来使用修改后的查询方法:

  1. 创建一个私有的sortByIdDesc()方法,该方法指定查询结果通过使用文档的ID降序排列。
  2. 通过调用TodoDocumentRepository接口中声明的查询方法来获取排序的查询结果。
  3. 返回查询结果。

让我们继续来看一下search()方法的不同实现。

从方法名称查询生成

通过使用从方法名称策略生成查询来构建查询时,可以使用TodoDocumentRepository接口的findByTitleContainsOrDescriptionContains()方法获取查询结果。

RepositoryTodoIndexService类的相关部分的源代码如下所示:

import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;@Service
public class RepositoryTodoIndexService implements TodoIndexService {@Resourceprivate TodoDocumentRepository repository;@Overridepublic List<TodoDocument> search(String searchTerm) {return repository.findByTitleContainsOrDescriptionContains(searchTerm, searchTerm, sortByIdDesc());}private Sort sortByIdDesc() {return new Sort(Sort.Direction.DESC, "id");}//Other methods are omitted
}

命名查询

使用命名查询构建查询时,可以使用TodoDocumentRepository接口的findByNamedQuery()方法获取查询结果。

RepositoryTodoIndexService的相关部分如下所示:

import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;@Service
public class RepositoryTodoIndexService implements TodoIndexService {@Resourceprivate TodoDocumentRepository repository;@Overridepublic List<TodoDocument> search(String searchTerm) {return repository.findByNamedQuery(searchTerm, sortByIdDesc());}private Sort sortByIdDesc() {return new Sort(Sort.Direction.DESC, "id");}//Other methods are omitted
}

@Query批注

使用@Query批注构建查询时,可以使用TodoDocumentRepository接口的findByQueryAnnotation()方法获取查询结果。

RepositoryTodoIndexService类的相关部分如下所示:

import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;@Service
public class RepositoryTodoIndexService implements TodoIndexService {@Resourceprivate TodoDocumentRepository repository;@Overridepublic List<TodoDocument> search(String searchTerm) {return repository.findByQueryAnnotation(searchTerm, sortByIdDesc());}private Sort sortByIdDesc() {return new Sort(Sort.Direction.DESC, "id");}//Other methods are omitted
}

对动态查询的查询结果进行排序

由于动态查询是通过向存储库接口添加自定义方法而创建的,因此对动态查询的查询结果进行排序所需的步骤对示例应用程序的服务层无效。

通过对自定义存储库接口的实现进行以下更改,我们可以对动态查询的查询结果进行排序:

  1. TodoDocumentRepositoryImpl类添加一个私有的sortByIdDesc()方法。 此方法返回一个Sort对象,该对象指定通过使用文档的ID对查询结果进行降序排序。
  2. 修改TodoDocumentRepositoryImpl类的search()方法。 使用Query接口的addSort()方法将排序选项设置为执行的查询,并将创建的Sort对象作为方法参数传递。

TodoDocumentRepositoryImpl类的相关部分如下所示:

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Sort;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.data.solr.core.query.Criteria;
import org.springframework.data.solr.core.query.SimpleQuery;
import org.springframework.stereotype.Repository;import javax.annotation.Resource;
import java.util.List;@Repository
public class TodoDocumentRepositoryImpl implements CustomTodoDocumentRepository {@Resourceprivate SolrTemplate solrTemplate;@Overridepublic List<TodoDocument> search(String searchTerm) {String[] words = searchTerm.split(" ");Criteria conditions = createSearchConditions(words);SimpleQuery search = new SimpleQuery(conditions);//SET SORT OPTIONSsearch.addSort(sortByIdDesc());Page results = solrTemplate.queryForPage(search, TodoDocument.class);return results.getContent();}private Criteria createSearchConditions(String[] words) {Criteria conditions = null;for (String word: words) {if (conditions == null) {conditions = new Criteria("id").contains(word).or(new Criteria("description").contains(word));}else {conditions = conditions.or(new Criteria("id").contains(word)).or(new Criteria("description").contains(word));}}return conditions;}private Sort sortByIdDesc() {return new Sort(Sort.Direction.DESC, "id");}//Other methods are omitted
}

摘要

现在,我们已经了解了如何使用Spring Data Solr对查询结果进行排序。 本教程教会了我们三件事:

  • 我们知道可以通过使用Sort类来指定使用的排序选项。
  • 我们了解到,可以通过向查询方法添加新的方法参数来对查询方法的查询结果进行排序。
  • 我们了解到,可以使用Query接口的addSort()方法将排序选项设置为动态查询。

我的Spring Data Solr教程的下一部分描述了如何对查询的查询结果进行分页 。

PS:此博客文章的示例应用程序可在Github上获得( 查询方法和动态查询 )。

参考: Spring Data Solr教程:在Petri Kainulainen博客上从JCG合作伙伴 Petri Kainulainen进行排序 。

翻译自: https://www.javacodegeeks.com/2013/05/spring-data-solr-tutorial-sorting.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368249.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈Java中的hashcode方法

浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生&#xff0c;而且在很多地方都会利用到hash表来提高查找效率。在Java的Object类中有一个方法: 1public native int hashCode();根据这个方法的声明可知&#xff0c;该方法返回一个int类型的数值&#xff0c;并…

前端机试面试题

一、题目要求 1、请实现“https://channel.jd.com/fashion.html”超值购部分内容。 2、使用CSS DIV实现页面布局&#xff0c;页面居中&#xff0c;文字颜色效果要求一致。40分 3、鼠标悬停时的动画效果。10分 4、“进入查看”标签与样式。10分 5、定义一个javascript数组&…

三分大法好

三分算法解决凸形或者凹形函数的极值&#xff1b; 如下图 lmid (Left Right) / 2 rmid (lmid Right) / 2; 如果lmid靠近极值点&#xff0c;则Right rmid&#xff1b; 否则(即midmid靠近极值点)&#xff0c;则Left lmid; 例题的话在我的博客相关分类中找. 转载于:https://w…

java stopself_如何正确停止前台服务?

我不知道它是否正确,但在我的应用程序中,我正在停止前台服务,它可以工作。请检查代码private void stopForegroundService() {// Stop foreground service and remove the notification.stopForeground(true);// Stop the foreground service.stopSelf();}更新打电话给stopserv…

将内存消耗减少20倍

这将是另一个故事&#xff0c;与我们分享有关内存相关问题的最新经验。 该案例是从最近的客户支持案例中提取的&#xff0c;在该案例中&#xff0c;我们遇到了一个行为异常严重的应用程序&#xff0c;该应用程序因生产中的OutOfMemoryError消息而死亡。 在连接了Plumbr的情况下…

Flex 布局教程:实例篇

该教程整理自 阮一峰Flexible教程 今天介绍常见布局的Flex写法。你会看到&#xff0c;不管是什么布局&#xff0c;Flex往往都可以几行命令搞定。 我的主要参考资料是Landon Schropp的文章和Solved by Flexbox。 一、骰子的布局 骰子的一面&#xff0c;最多可以放置9个点。 下面…

在Windows运行Python程序

在Windows运行Python程序 转载于:https://www.cnblogs.com/macT/p/9289091.html

基于java的网上花店销售系统_基于web的花店销售系统的设计与实现

基于web的花店销售系统的设计与实现(论文13000字)摘要&#xff1a;本系统是一个相对简单的基本应用系统&#xff0c;主要满足传统的花店运营需要&#xff0c;将自己的销售渠道扩展到网上&#xff0c;通过简单的管理&#xff0c;提供给最终消费者产品的展现、购物、订单处理等实…

mysql安装及一些配置

apt-get updateapt-get install mysql-server$mysql -u root#修改密码root密码为123456mysql> GRANT ALL PRIVILEGES ON *.* TO rootlocalhost IDENTIFIED BY "123456";#创建数据库xxxmysql>CREATE DATABASE xxx;#创建一个账户 xxx_root对数据库xxx有全部权限&…

Apache Server和JMeter调试

我一直在使用JMeter为生产服务器生成负载以测试我的应用程序。 该测试计划具有13个以上的HTTP采样器以发出不同的请求&#xff0c;并具有一个正则表达式提取器以从响应中提取一些值。 此值在连续的HTTP Sampler中使用。 这个测试用例简单而直接。 最初&#xff0c;我使用200个J…

Flexible 弹性盒子模型之flex

实例 让所有弹性盒模型对象的子元素都有相同的长度&#xff0c;忽略它们内部的内容&#xff1a; #main div{flex:1;} 复制 效果预览 浏览器支持 表格中的数字表示支持该属性的第一个浏览器的版本号。 紧跟在 -webkit-, -ms- 或 -moz- 后的数字为支持该前缀属性的第一个版本。 …

java冒泡遍历对象_Java经典排序算法(冒泡、选择、插入)

排序算法说明排序说明对一序列对象根据某个关键字进行排序。术语说明稳定&#xff1a;如果a原本在b前面&#xff0c;而ab&#xff0c;排序之后a仍然在b的前面&#xff1b;不稳定&#xff1a;如果a原本在b的前面&#xff0c;而ab&#xff0c;排序之后a可能会出现在b的后面&#…

create your own github repository and build link to your local project

1. create a repository in you github.  i.e. repository name: spring5_exercise 2. initial git profile in your local project root directory. echo "# spring5_exercise" >> README.md git init git add README.md git commit -m "first commit&…

快速分类–三向和双枢轴

毫无疑问&#xff0c;Quicksort被认为是本世纪最重要的算法之一&#xff0c;并且它是许多语言&#xff08;包括Java中的Arrays.sort &#xff09;的事实上的系统排序。 那么&#xff0c;quicksort有何新功能&#xff1f; 嗯&#xff0c;除了我现在&#xff08;在Java 7发行了2…

mysql workbench启动_怎么启动mysql workbench

答&#xff1a;你好&#xff0c;方法/步骤 如下&#xff1a; 双击或右键打开MySQL Workbench&#xff0c;进入软件主界面。 点击new connection,会有个弹出框&#xff0c;让我们填写user(用户名)&#xff0c;password(密码)。 填写完用户名和密码&#xff0c;点击确定就会出现我…

在jekyll模板博客中添加网易云模块

最近使用GitHub Pages Jekyll 搭建了个人博客&#xff0c;作为一名重度音乐患者&#xff0c;博客里面可以不配图&#xff0c;但是不能不配音乐啊。 遂在博客里面引入了网易云模块&#xff0c;这里要感谢网易云的分享机制&#xff0c;对开发者非常友好&#xff1a; 1.每首歌曲…

C# Timer定时器用法

System.Timers.Timer timer1 new System.Timers.Timer(); timer1.Elapsed new System.Timers.ElapsedEventHandler((obj, eventArg) > {Console.WriteLine("aaa"); }); timer1.Interval 2000;//毫秒 1秒1000毫秒 timer1.Enabled true;//必须加上 timer1.AutoR…

线性规划对偶原理

留坑啊留坑。。 白天老师讲的都没听说过 晚上肯定整理不玩啊&#xff0c;&#xff0c;&#xff0c; 转载于:https://www.cnblogs.com/zwfymqz/p/8253842.html

在WebLogic Server上驯服JMX

让我们先假设几件事&#xff1a; 我假设您听说过Java的JMX功能并熟悉它的功能&#xff08;远程公开和管理您的服务&#xff09;。 您应该知道默认JVM将具有一个可以注册MBean的Platform MBeanServer实例。 您可以使用JDK中的jconsole命令查看它们。 到目前为止&#xff0c;我…

java 18.9_Oracle: Java 11 (18.9 LTS) 正式上线!

美国时间9月25日&#xff0c;Oracle 官方表示&#xff0c; Java 11 (18.9 LTS) 正式上线!这是自 Java 8 后的第一个长期支持版本。Java 11 版本说明按照 Oracle 公布的支持路线图&#xff0c;Java 11 将会获得 Oracle 提供的长期支持服务&#xff0c;直至2026年9月。为了更快地…