Spring Data Solr教程:动态查询

Solr通常被称为搜索服务器,我们可以在实现全文搜索功能时使用它。 但是,当我们实现从搜索表单获取其输入的搜索功能时,利用Solr的性能通常是明智的。

在这种情况下,执行的搜索查询取决于收到的输入。 这意味着查询参数的数量取决于输入到搜索表单的输入。 换句话说,执行的搜索查询是动态的。

我的Spring Data Solr教程的前一部分教我们如何将自定义方法添加到单个存储库。 现在该使用这些信息并了解如何使用Spring Data Solr创建动态查询。 让我们开始吧。

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

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

创建动态查询

本节描述了如何使用Spring Data Solr创建动态查询。 它分为两个小节,如下所述:

  • 第一部分描述了在开始实际搜索功能之前需要了解的基础知识。
  • 第二部分描述了如何通过向Spring Data Solr存储库添加自定义方法来实现示例应用程序的搜索功能。

学习基础

在开始实现示例应用程序的搜索功能之前,我们需要知道如何使用Spring Data Solr“手动”创建查询。 我们可以按照以下步骤“手动”创建查询:

  1. 创建搜索条件。
  2. 创建查询,其中包含使用的搜索条件。
  3. 执行创建的查询。

下面将更详细地描述这些步骤。

创建搜索条件

首先,我们必须为查询创建搜索条件。 我们可以使用以下描述的条件类来做到这一点:

  • org.springframework.data.solr.core.query.SimpleStringCriteria类是基本条件类,用于通过使用已经格式化的查询字符串来指定执行的查询。 此类中指定的查询字符串按原样执行。 因此,此类不能用于构建动态查询。
  • org.springframework.data.solr.core.query.Criteria是用于构建动态查询的条件类。 它具有流畅的API,该API支持多个Criteria对象的链接。

创建执行的查询

其次,我们必须创建执行的查询。 下面介绍Spring Data Solr的查询类:

  • org.springframework.data.solr.core.query.SimpleQuery类是一个支持分页和分组的查询类。
  • org.springframework.data.solr.core.query.SimpleFacetQuery类是支持多面搜索的查询类。
  • org.springframework.data.solr.core.query.SimpleFilterQuery类是支持过滤器查询的查询类。

执行创建的查询

第三,我们必须执行创建的查询。 SolrTemplate类实现了一些可用于此目的的方法。 下面介绍了这些方法:

  • long count(最终SolrDataQuery查询)方法返回使用作为方法参数给出的查询找到的文档数。
  • UpdateResponse delete(SolrDataQuery query)方法删除与作为方法参数给出的查询匹配的文档,并返回一个UpdateResponse对象。
  • T queryForObject(Query query,Class <T> clazz)方法返回与作为方法参数给出的查询匹配的单个文档。
  • FacetPage <T> queryForFacetPage(FacetQuery query,Class <T> clazz)方法针对Solr索引执行构面查询,并将查询结果作为FacetPage对象返回。
  • Page <T> queryForPage(Query query,Class <T> clazz)方法对Solr索引执行查询,并作为Page接口的实现返回查询结果。

让我们继续实践该理论。

实现搜索功能

我们的搜索功能的要求如下:

  • 搜索功能必须返回名称或描述包含给定搜索词的某些单词的所有待办事项。 换句话说,如果搜索词是“ Foo Bar”,则我们的搜索功能必须返回标题或描述包含“ Foo”或“ Bar”的待办事项条目。
  • 搜索必须不区分大小写。

因为我们的搜索功能不是静态的,所以我们必须使用动态查询来创建它。 我们可以通过在Spring Data Solr存储库中添加自定义方法来使用Spring Data Solr创建动态查询。 换句话说,我们必须遵循以下步骤:

  1. 创建一个自定义接口,该接口声明添加的方法。
  2. 实现创建的接口。
  3. 修改存储库接口以扩展创建的接口。

下面将更详细地描述这些步骤。

创建自定义界面

首先,我们必须创建一个自定义接口,该接口声明我们的自定义搜索方法。 我们可以按照以下步骤进行操作:

  1. 创建一个名为CustomTodoDocumentRepository的接口。
  2. 声明search()方法。 此方法将使用的搜索词作为方法参数,并返回TodoDocument对象的列表。

CustomTodoDocumentRepository接口的源代码如下所示:

public interface CustomTodoDocumentRepository {public List<TodoDocument> search(String searchTerm);//Other methods are omitted.
}

实施创建的接口

其次,我们必须实现我们之前创建的自定义接口。 我们可以按照以下步骤进行操作:

  1. 创建一个名为TodoDocumentRepositoryImpl的类,并实现CustomTodoDocumentRepository接口。
  2. @Repository批注对类进行批注。
  3. SolrTemplate字段添加到类中,并使用@Resource注释对其进行注释。
  4. 实现search()方法。

search()方法的实现需要在此给出更详细的描述。 我们可以通过执行以下步骤来实现search()方法:

  1. 获取搜索词的单词。
  2. 通过调用私有createSearchConditions()方法并将搜索词的单词作为方法参数来构造使用的搜索条件。 此方法通过使用Criteria类的API创建使用的搜索条件。
  3. 通过创建新的SimpleQuery对象来创建执行的查询,并将创建的Criteria对象作为构造函数参数传递。
  4. 通过调用SolrTemplate类的queryForPage()方法获取搜索结果。 将创建的查询和预期结果对象的类型作为方法参数传递。
  5. 通过调用Page接口的getContent()方法来返回搜索结果。

TodoDocumentRepositoryImpl类的源代码如下所示:

import org.springframework.data.domain.Page;
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;@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);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(“title”).contains(word).or(new Criteria(“description”).contains(word));}else {conditions = conditions.or(new Criteria(“title”).contains(word)).or(new Criteria(“description”).contains(word));}}return conditions;}//Other methods are omitted
}

修改存储库界面

第三,我们必须使我们的自定义search()方法对存储库的用户可见。 我们可以通过扩展CustomTodoDocumentRepository接口来实现。 TodoDocumentRepository接口的源代码如下所示:

import org.springframework.data.solr.repository.SolrCrudRepository;public interface TodoDocumentRepository extends CustomTodoDocumentRepository, SolrCrudRepository<TodoDocument, String> {}

现在,我们向Spring Data Solr存储库添加了一个自定义search()方法。 让我们找出如何使用此方法。

使用自定义方法

我们可以通过修改RepositoryTodoIndexService类的search()方法来使用自定义方法。 此方法的新实现非常简单。 它通过调用我们的Spring Data Solr存储库的search()方法获取搜索结果,并返回搜索结果。

RepositoryTodoIndexService类的源代码如下所示:

import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.List;@Service
public class RepositoryTodoIndexService implements TodoIndexService {@Resourceprivate TodoDocumentRepository repository;//Other methods are omitted.@Overridepublic List<TodoDocument> search(String searchTerm) {return repository.search(searchTerm);}
}

摘要

现在,我们已经使用Spring Data Solr实现了动态搜索功能。 尽管我们的搜索功能非常简单,但是我们现在也应该能够实现更复杂的查询。

本教程教了我们两件事:

  • 我们学习了如何使用Spring Data Solr“手动”创建查询。
  • 我们了解到,必须通过向单个存储库添加自定义方法来实现动态搜索方法。

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

PS此博客文章的示例应用程序可在Github上获得 。

参考: Spring Data Solr教程: Petri Kainulainen博客上来自我们JCG合作伙伴 Petri Kainulainen的动态查询 。

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

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

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

相关文章

[cdq分治][树状数组] Jzoj P4419 hole

Description GFS打算去郊外建所别墅&#xff0c;享受生活&#xff0c;于是他耗费巨资买下了一块风水宝地&#xff0c;但令他震惊的是&#xff0c;一群DSJ对GFS的富贵生活深恶痛绝&#xff0c;决定打洞以搞破坏。现在我们简化一下这个问题&#xff0c;在这片土地上会按顺序发生一…

关于CSS3实现响应式布局的一些概念和术语

响应式布局也被应用到网站前端开发中&#xff0c;在国内这一词想必是非常火吧&#xff0c;那网站为什么要使用响应式布局呢&#xff1f;原因和其他创意性的生活用品基本上是一样的&#xff0c;处于对人力物力财力的节省和对生活富有诗意的一种追求。在人力物力和财力有限的情况…

AjaxSubmit+Servlet表单文件上传和下载

一、背景 前段时间公司要求我做一个上传和下载固件的页面&#xff0c;以备硬件产品在线升级&#xff0c;现在我把这部分功能抽取出来作为一个Demo Project给大家分享。 话不多说&#xff0c;先看项目演示 --> 演示 源码 二、源码 前端 js库&#xff1a;jquery-3.2.1.min.js…

番石榴的EventBus –简单的发布者/订阅者

在查看Google的Guava Libraries 版本10的最新版本时&#xff0c;我注意到EventBus的添加。 这是发布-订阅样式消息传递系统的轻量级实现。 这类似于JMS提供的发布-订阅模型&#xff0c;但是消息保留在应用程序内&#xff0c;而不是在外部广播。 EventBus允许您在程序中创建对象…

apscheduler -定时任务

https://apscheduler.readthedocs.io/en/latest/userguide.html 简单的使用方式为&#xff1a; from apscheduler.schedulers.blocking import BlockingScheduler sched BlockingScheduler()sched.add_job(ff_task,cron,hour0-1,8-23,minute28)sched.add_job(avor_task, cron,…

java迭代器 异常_java迭代器失效 | 学步园

今天在测试代码的时候出现一个异常ConcurrentModificationException&#xff0c;该异常网上很多解决方案以及解释&#xff0c;但我还是再记录一遍吧。代码抽象出来是这样的&#xff1a;import java.util.ArrayList;import java.util.List;public class Test {public static voi…

CSS3中的圆角边框属性详解(border-radius属性)

实例向 div 元素添加圆角边框&#xff1a;div{border:2px solid;border-radius:25px;}页面底部有更多实例。浏览器支持IEFirefoxChromeSafariOperaIE9 、Firefox 4 、Chrome、Safari 5 以及 Opera 支持 border-radius 属性。定义和用法border-radius 属性是一个简写属性&#x…

83.const与类

const常量对象,无法改变数据,只能引用尾部带const方法类的成员如果是const,可以默认初始化,也可以构造的初始化,不可在构造函数内部初始化类中的const成员,无法直接修改,可以间接修改类的成员函数const三种情形:1.返回值const,2.返回常量,3.参数const,可读不可写,尾部const,常量…

使用Apache CXF开发RESTful服务

介绍 如您所知&#xff0c;有两种开发Web服务的方法 简单对象访问协议&#xff08;SOAP&#xff09; 代表性状态转移&#xff08;REST&#xff09; 在继续学习如何使用Apache CXF创建基于REST的Web服务之前&#xff0c;我们将了解什么是REST。 REST不是一项技术&#xff0c;…

CTU 2017 J - Punching Power (二分图匹配)

题意&#xff1a; 公园管理层最终决定在公园的各个战略位置安装一些流行的拳击机。实际上&#xff0c;为了弥补以前缺少的机器&#xff0c;他们决定安装尽可能多的机器。令人惊讶的是&#xff0c;公园不会被新机器堵塞&#xff0c;因为对于机器的位置存在一些非常严重的法律限制…

UI设计师必知:link和@import引用css文件方法的区别

<link>元素所参考的样式用户可以自由的选择加以改变&#xff0c;而导入的样式表单就自动的与剩下的样式表融合在一起了CSS与HTML文档结合的4中方法&#xff1a;1 使用<link>元素链接到外部的样式文件2 在<head>元素中使用"style"元素来指定3 使用C…

javascript mqtt 发布订阅消息

js client使用paho-mqtt&#xff0c;官网地址&#xff1a;http://www.eclipse.org/paho/&#xff0c;参考http://www.eclipse.org/paho/clients/js/官网给出例子Getting Started&#xff0c;写出下面简单的测试代码。 <!DOCTYPE html> <html> <head> <met…

linux java jar war_简单介绍Java 的JAR包、EAR包、WAR包区别

WAR包WAR(Web Archive file)网络应用程序文件&#xff0c;是与平台无关的文件格式&#xff0c;它允许将许多文件组合成一个压缩文件。War专用于Web方面。大部分的JAVA WEB工程&#xff0c;都是打成WAR包进行发布的。War是一个web模块&#xff0c;其中需要包括WEB-INF&#xff0…

Spring Web应用程序的最大缺陷

在其应用程序中使用Spring Framework的开发人员很好地谈论了依赖注入的好处。 不幸的是&#xff0c;他们并不是很好地利用它的好处&#xff0c;例如单一负责的原则和在应用程序中关注点的分离 。 如果我们看一下任何基于Spring的Web应用程序&#xff0c;很可能会通过使用以下常…

用C++调用tensorflow在python下训练好的模型(centos7)

本文主要参考博客https://blog.csdn.net/luoyexuge/article/details/80399265 [1] bazel安装参考:https://blog.csdn.net/luoyi131420/article/details/78585989 [2] 首先介绍下自己的环境是centos7&#xff0c;tensorflow版本是1.7&#xff0c;python是3.6&#xff08;anacond…

纯CSS实现圆角边框

HTML部分&#xff1a;<body><div> <b class”t1″></b> <b class”t2″></b> <b class”t3″></b> <b class”t4″></b> <div class”cont”>这边输入实际内容</div> <b clas…

ActiveMQ producer同步/异步发送消息

http://activemq.apache.org/async-sends.html producer发送消息有同步和异步两种模式&#xff0c;可以通过代码配置&#xff1a; ((ActiveMQConnection)connection).setUseAsyncSend(true); producer默认是异步发送消息。在没有开启事务的情况下&#xff0c;producer发送持久化…

Java Priority Queue(PriorityQueue)示例

我们知道&#xff0c; 队列如下&#xff1a;F irst- 我正˚First-UT模型&#xff0c;但有时我们需要处理的基础上&#xff0c;优先级队列中的对象。 例如&#xff0c;假设我们有一个应用程序可以为日常交易生成股票报告&#xff0c;并处理大量数据并花费时间来处理它。 因此&am…

css未知尺寸的图片的水平和垂直居中

纯CSS实现未知尺寸的图片水平和垂直居中.box { /*非IE的主流浏览器识别的垂直居中的方法*/ display: table-cell; vertical-align:middle; /*设置水平居中*/ text-align:center; /* 针对IE的Hack */ *display: block; *font-size:26…

heap 的一些用法

noip 合并果子 #include<bits/stdc.h> using namespace std; int heap[maxn]; int size0; void input(int d) {heap[size]d;push_heap(heap,heapsize,greater<int>()); } int get() {pop_heap(heap,heapsize,greater<int>());//pop_heap(heap,heapsize);ret…