Spring Data Solr教程:查询方法

我们已经了解了如何配置Spring Data Solr。 我们还学习了如何向Solr索引添加新文档,如何更新现有文档的信息以及从Solr索引删除文档。 现在是时候继续前进,学习如何使用Spring Data Solr从Solr索引中搜索信息。 我们的搜索功能的要求如下:

  • 搜索功能必须返回标题或描述包含给定搜索词的所有待办事项。
  • 搜索必须不区分大小写。

我们可以按照以下步骤实现搜索功能:

  1. 创建一个查询方法。
  2. 使用创建的查询方法。

让我们继续研究如何使用查询方法实现搜索功能。

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

  • 使用Maven运行Solr
  • Spring Data Solr教程:Solr简介
  • Spring Data Solr教程:配置
  • Spring Data Solr教程CRUD(几乎)

创建查询方法

查询方法是

  1. 添加到存储库界面。
  2. 用于指定在调用查询方法时执行的搜索查询。
  3. 用于构建静态查询(具有相同数量查询参数的查询)。

我们可以通过以下技术使用Spring Data Solr创建查询方法:

  • 从方法名称查询生成
  • 命名查询
  • @Query批注

在以下小节中将更详细地描述这些技术。

从方法名称查询生成

从方法名称生成查询是一种查询生成策略,其中从查询方法的名称解析执行的查询。

  1. 查询方法的名称必须以特殊的前缀开头,该前缀标识查询方法。 这些前缀是: find,findBy,get,getBy,read和readBy 。 解析执行的查询时,将从方法名称中删除此前缀。
  2. 属性表达式用于引用我们文档类的属性。
  3. 特殊关键字与属性表达式一起使用,以指定在创建的查询中使用的运算符。 在属性表达式之后,将这些关键字添加到查询方法的名称中。
  4. 我们可以通过在属性表达式之间添加AndOr关键字来组合属性表达式。
  5. 查询方法的参数计数必须等于其名称中使用的属性表达式的数量。

通过阅读以下资源,我们可以获得有关属性表达式和存储库关键字的更多信息:

  • Spring Data Solr参考手册:查询创建
  • Spring Data Solr参考手册:存储库查询关键字

我们记得,我们的搜索功能必须返回标题或描述包含给定搜索词的所有待办事项。 同样,我们的文档类具有两个在查询中使用的属性。 这些属性称为titledescription 。 通过执行以下步骤,我们可以创建满足搜索功能要求的方法名称:

  1. findBy前缀添加到方法名称的开头。
  2. 在前缀之后添加title属性的属性表达式。
  3. 在属性表达式之后添加Contains关键字。
  4. Or关键字添加到方法名称。
  5. Or关键字之后添加description属性的属性表达式。
  6. Contains关键字添加到方法名称。
  7. 在我们的查询方法中添加两个方法参数。 第一个参数与title属性匹配,第二个参数与description属性匹配。

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

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

注意:如果搜索词包含多个单词,则此查询方法将不起作用。

命名查询

命名查询是在单独的属性文件中声明并连接到正确查询方法的查询。 以下描述了有关用于声明命名查询的属性文件的规则:

  • 属性文件的默认位置是META-INF / solr-named-queries.properties,但是我们可以使用@EnableSolrRepositories批注的namedQueriesLocation属性来配置位置。
  • 使用以下公式创建每个命名查询的键: [文档类的名称]。[命名查询的名称]

使用以下规则,将在属性文件中配置的命名查询与我们的存储库界面的查询方法进行匹配:

  • 执行命名查询的查询方法的名称必须与命名查询的名称相同。
  • 如果查询方法的名称与命名查询的名称不同,则必须使用@Query注释对查询方法进行注释,并且必须使用@Query注释的name属性配置命名查询的名称 。 。

通过执行以下步骤,我们可以使用命名查询实现查询方法:

  1. 指定命名查询。
  2. 创建查询方法。

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

指定命名查询

通过执行以下步骤,我们可以创建一个满足查询功能要求的命名查询:

  1. 创建包含命名查询的属性文件。
  2. 使用前面描述的公式为命名查询创建一个键。 由于文档类的名称为TodoDocument ,因此命名查询的键为TodoDocument.findByNamedQuery
  3. 使用Lucene查询解析器语法创建命名查询。 因为我们的查询必须返回标题或描述包含给定搜索词的文档,所以我们的查询是: title:*?0 * OR description:*?0 *?0替换为查询方法的第一个参数的值)。

META-INF / solr-named-query.properties文件的内容如下所示:

TodoDocument.findByNamedQuery=title:*?0* OR description:*?0*

创建查询方法

通过执行以下步骤,我们可以创建使用创建的命名查询的查询方法:

  1. findByNamedQuery()方法添加到TodoDocumentRepository接口。 这个方法返回TodoDocument对象的列表中,并称为SEARCHTERM一个字符串参数。
  2. @Query注释注释该方法,并将其name属性的值设置为'TodoDocument.findByNamedQuery'。 不需要此步骤,因为查询方法的名称与命名查询的名称相同,但是我想在此处演示@Query注释的用法。

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

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

@Query注释

@Query批注可用于指定在调用查询方法时执行的查询。 通过执行以下步骤,我们可以创建满足搜索功能要求的查询方法:

  1. findByQueryAnnotation()方法添加到TodoDocumentRepository接口。 这个方法返回TodoDocument对象的列表,它有一个名为SEARCHTERM一个字符串参数。
  2. @Query注释对方法进行注释。
  3. 将执行的查询设置为@Query批注的值。 我们可以使用Lucene查询解析器语法创建查询。 因为我们的查询必须返回标题或描述包含给定搜索词的文档,所以正确的查询是: title:*?0 * OR description:*?0 *?0替换为查询方法的第一个参数的值) 。

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

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

使用创建的查询方法

我们可以按照以下步骤使用创建的查询方法:

  1. TodoIndexService接口中声明search()方法。
  2. search()方法的实现添加到RepositoryTodoIndexService类。

在以下小节中将更详细地描述这些步骤。

声明搜索方法

我们的第一步是在TodoIndexService接口中声明搜索方法。 TodoIndexService接口的相关部分如下所示:

import java.util.List;public interface TodoIndexService {public List<TodoDocument> search(String searchTerm);
}

实施搜索方法

我们的第二步是实现search()方法。 我们的实现非常简单。 它通过调用TodoDocumentRepository接口的正确方法来获取TodoDocument对象的列表,并返回该列表。

查询方法的名称取决于用于创建查询方法的技术。 下面描述不同的实现。

从方法名称查询生成

当我们从查询方法的名称生成查询时,我们的实现通过调用TodoDocumentRepository接口的findByTitleContainsOrDescriptionContains()方法获取TodoDocument对象的列表,并返回该列表。

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

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);}
}

命名查询

如果使用命名查询,则我们的实现将通过调用TodoDocumentRepository接口的findByNamedQuery()方法获取TodoDocument对象的列表,并返回该列表。

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

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);}
}

@Query注释

当我们使用@Query批注时,我们的实现通过调用TodoDocumentRepository接口的findByQueryAnnotation()方法获取TodoDocument对象的列表,并返回该列表。

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

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);}
}

选择正确的查询创建技术

显而易见的问题是:

将查询方法添加到我们的Spring Data Solr存储库中的最佳方法是什么?

在为查询方法确定正确的查询创建技术时,可以使用以下准则:

  • 如果创建的查询非常简单,则从方法名称生成查询通常是最佳选择。 这种方法的问题在于,用这种方法实现“复杂”查询会导致方法名称冗长而丑陋。
  • 将查询保持在查询方法附近是一个好主意。 使用@Query批注的好处是,我们可以通过阅读存储库接口的源代码来查看执行的查询和查询方法。
  • 如果我们想将执行的查询与存储库接口分开,则应使用命名查询。 这种方法的问题是我们必须从属性文件中检查已执行的查询,这非常麻烦。

摘要

现在,我们已经了解了如何使用Spring Data Solr创建静态查询。 这篇博客文章告诉我们两件事:

  • 我们知道什么是查询方法,以及如何创建它们。
  • 我们熟悉各种查询创建技术,并且知道何时使用它们。

Github上提供了演示此博客条目中描述的概念的示例应用程序。 在本教程的下一部分中,我们将学习如何将自定义功能添加到单个存储库 。

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

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

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

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

相关文章

深入浅出时序逻辑电路(1)

我们一提到时序逻辑电路&#xff0c;就会想到触发器 先讲讲时序逻辑电路&#xff1a;时序逻辑电路&#xff08;常简称为时序电路&#xff09;内部包含存储器&#xff0c;用于记忆电路的工作状态和输入变化情况&#xff0c;其输出由当前的输入和存储信息共同确定的一种电路。 再…

云幸福–如何在几分钟内安装新的OpenShift Container Platform 3.7

此安装需要安装Red Hat Middleware产品流&#xff08;预先配置的容器选项&#xff09;以及所有其他功能&#xff0c;例如源容器&#xff0c;映像容器和.Net Core容器。自OpenShift容器平台发布以来&#xff0c;我一直希望提供一个简单的方法。 &#xff0c;完全配置且易于使用的…

从分析一个简单的时序电路入手

这道题怎么搞呢 先看图 看到了一个JK触发器&#xff0c;左边那个是J触发器转化为D触发器 右边那个就是JK触发器 写出两个次态方程&#xff1a;还有一个输出表达式&#xff1a;将激励函数带入表达式&#xff0c;求出两个次态方程 然后画出状态表&#xff1a; 再画出状态图&a…

组合逻辑电路运算法则

逻辑电路计算性质 与非门&#xff1a;有0出1&#xff0c;全1才0 & 或非门&#xff1a;有1出0&#xff0c;全0才1 >1 异或门&#xff1a;相同出0&#xff0c;不同出1 ⊕ 常用公式 ABAB‾\overline{B}BA AABA AAB‾\overline{B}BAB A00 A1A A*A‾\overline{A}A0 …

jmeter实现翻页功能_JMeter定制功能实现

jmeter实现翻页功能JMeter提供了可在采样器中使用的功能。 在编写复杂的测试计划时&#xff0c;您会觉得JMeter缺少某些方法。 您使用Beanshell脚本定义自己的自定义方法。 JMeter调用Beanshell解释器来运行脚本。 只要您不产生高负载&#xff08;大量线程&#xff09;&#xf…

常见的集成逻辑门(CMOS\TTL\ECL)

CMOS系列 TTL系列 ECL系列 集成逻辑门的主要性能指标 关于噪声容限UN 输出负载能力 总结一下&#xff1a;不管那么多&#xff0c;先把两个算出来&#xff0c;取最小的就完事了 答案&#xff1a;ECL,CMOS,ECL,CMOS

git如何快速提交代码(大学生适用)

众所周知&#xff0c;git是一个强大的版本控制工具 git的学习成本比较高&#xff0c;但大学生常用的功能也就那么几个 首先你需要下载一个git&#xff0c;生成一个密钥 生成方法&#xff1a;打开git&#xff08;bash&#xff09; $ ssh-keygen -t rsa -C “你的邮箱地址”&a…

Spring框架–应用程序上下文–到达应用程序上下文的三种方法

本文向您展示了三种不同的方式来获取代码中的Spring Framework Application Context。 摘要 &#xff08;这是我在2010年撰写的旧文章的转贴&#xff09;。 在Google中搜索“ Spring ApplicationContextAware ”时&#xff0c;您会遇到很多建议&#xff0c;而且我也看到很多人…

最简单的语言来说JAVA中的NEW到底怎么搞

new 到底是干啥的&#xff1f; JAVA中的new关键字就是在你声明了一个对象后&#xff0c;来给对象分配相应的内存&#xff0c;可以使用任何public来构造 People stunew People( ); new 在堆中为对象申请了一块空间&#xff0c;new也使用了父类的构造方法 java里的new的英文意…

34个计算机网络易错知识点总结

不属于网络体系结构所描述的内容是&#xff1a;协议的内部实现细节OSI模型中第N层为第N1层提供服务自下而上第一个提供端到端服务的是传输层通信子网&#xff1a;1.高速链路2.交换机3.路由器TCP/IP模型中一共由四层&#xff0c;分别是&#xff1a; 1.应用层&#xff1a;应用层是…

mongodb副本集_设置MongoDB副本集分为4个步骤

mongodb副本集介绍 在详细介绍配置MongoDB副本集之前&#xff0c;让我简要介绍一下它们&#xff1a; 副本集是Mongodb数据库提供的功能&#xff0c;可实现高可用性和自动故障转移。 它是一种传统的主从配置&#xff0c;但具有自动故障转移功能。 基本上&#xff0c;它是mong…

JAVA类的继承、覆写和final关键字

extends不用多说&#xff0c;是来继承的关键字&#xff0c;但它有几个要点&#xff1a; java不允许多重继承(一个类只能继承一个父类,不能继承多个父类)派生类会继承基类所有属性和方法,但不能直接访问基类的private私有属性实例化派生类时,会先去调用父类的构造方法构造基类,…

Spring Boot:使用Thymeleaf布局方言的Thymeleaf模板装饰器

介绍 在所有Thymeleaf模板上重用页眉和页脚的问题经常在StackOverflow上提出。 在本文中&#xff0c;我将向您展示如何使用Thymeleaf布局方言来结构化模板&#xff0c;以在Spring Boot应用程序中实现更高的代码可重用性。 创建一个Spring Boot应用程序 让我们使用Spring Initi…

猫、狗与Java的多态

多态&#xff08;Polymorphism&#xff09;按字面的意思就是“多种状态”。在面向对象语言中&#xff0c;接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术&#xff0c;赋值之后&#…

solr crud_Spring Data Solr教程:CRUD(差不多)

solr crud在我的Spring Data Solr教程的上一部分中&#xff0c;我们学习了如何配置Spring Data Solr。 现在该迈出一步&#xff0c;了解我们如何管理Solr实例中存储的信息。 此博客文章描述了我们如何向Solr索引添加新文档&#xff0c;如何更新现有文档的信息以及如何从索引中删…

子类覆盖父类(Java)

要求&#xff1a;尝试创建一个父类&#xff0c;在父类中创建两个方法&#xff0c;在子类中覆盖第二个方法&#xff0c;再为子类创建一个对象&#xff0c;将它向上转型并调用这个方法 由于Java里面没有虚函数&#xff0c;所以它的多态是可以被继承的 public class tyu{public …

在Java中进行输入验证时用错误通知替换异常

在我以前的文章中&#xff0c;我写了一个输入验证设计&#xff0c;该设计取代了难以维护和测试的 if-else块。 但是&#xff0c;正如某些读者指出的那样&#xff0c;它有一个缺点–如果输入数据有多个验证错误&#xff0c;则用户将不得不多次提交请求以查找所有错误。 从可用性…

Java构建子类对象时的顺序

先看一个这么的程序&#xff1a; //------------------------------------------------------------------------// //程序目的&#xff0c;创建一个父类与子类&#xff0c;分别创建构造方法 public abstract class usecase1 {abstract void testAbstract();usecase1(){//&…

关于Java中serialUID的序列化的问题

在我们平时处理JAVA类中的问题时&#xff0c;有时会碰见类似这样的一行代码&#xff1a; private static final long serialVersionUID 1L;这就是程序的序列化ID 所谓序列化&#xff0c;用一句通俗的话来说&#xff0c;就是将对象冻结了放入硬盘的过程&#xff0c;举一个例子…

java 绑定微信号开发_Java开发中的常见危险信号

java 绑定微信号开发在开发&#xff0c;阅读&#xff0c;复审和维护成千上万行Java代码的几年中&#xff0c;我已经习惯于看到Java代码中的某些“ 危险信号 ”&#xff0c;这些信号通常&#xff08;但可能并非总是&#xff09;暗示着代码有问题。 我不是在谈论总是错误的做法&a…