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

solr crud

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

通过执行以下步骤,我们可以对示例应用程序进行必要的修改:

  1. 创建一个文档类,其中包含存储在Solr索引中的信息。
  2. 为我们的Spring Data Solr存储库创建一个存储库接口。
  3. 创建一个使用创建的存储库的服务。
  4. 使用创建的服务。

以下各节将更详细地描述这些步骤。

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

  • 使用Maven运行Solr
  • Spring Data Solr教程:Solr简介
  • Spring Data Solr教程:配置

创建文档类

第一步是创建一个文档类,其中包含添加到Solr索引中的信息。 文档类基本上只是一个POJO,它通过遵循以下规则来实现:

  • @Field批注用于在POJO的字段和Solr文档的字段之间创建链接。
  • 如果Bean的字段名称与文档的字段名称不同,则必须以@Field批注的值给出文档的字段名称。
  • @Field批注可以应用于字段或setter方法。
  • Spring Data Solr默认情况下假设文档的id字段的名称为'id'。 我们可以通过使用@Id注释对id字段进行注释来覆盖此设置。
  • Spring Data Solr(版本1.0.0.RC1)要求文档ID的类型为String

更多信息

  • Solrj @ Solr维基

让我们继续创建我们的文档类。

在我的Spring Data Solr教程的第一部分中,我们了解到必须将每个todo条目的id描述标题存储到Solr索引中。

因此,我们可以按照以下步骤为待办事项创建文档类:

  1. 创建一个名为TodoDocument的类。
  2. id字段添加到TodoDocument类,并与@Field注解注释字段。 使用@Id注释对字段进行注释(由于id字段的名称为'id',所以这不是必需的,但我想在此处演示其用法)。
  3. 说明字段添加到TodoDocument类,并与@Field注解注释这一领域。
  4. 标题字段添加到TodoDocument并与@Field注解注释这一领域。
  5. TodoDocument类的字段中创建getter方法。
  6. 创建一个静态内部类,该内部类用于构建新的TodoDocument对象。
  7. 将静态getBuilder()方法添加到TodoDocument类。 此方法的实现返回一个新的TodoDocument.Builder对象。

TodoDocument类的源代码如下所示:

import org.apache.solr.client.solrj.beans.Field;
import org.springframework.data.annotation.Id;public class TodoDocument {@Id@Fieldprivate String id;@Fieldprivate String description;@Fieldprivate String title;public TodoDocument() {}public static Builder getBuilder(Long id, String title) {return new Builder(id, title);}//Getters are omittedpublic static class Builder {private TodoDocument build;public Builder(Long id, String title) {build = new TodoDocument();build.id = id.toString();build.title = title;}public Builder description(String description) {build.description = description;return this;}public TodoDocument build() {return build;}}
}

创建存储库界面

Spring Data Solr存储库的基本接口是SolrCrudRepository <T,ID>接口,每个存储库接口都必须扩展此接口。

当扩展SolrCrudRepository <T,ID>接口时,我们必须提供两个类型参数,下面将对其进行描述:

  • T type参数表示我们的文档类的类型。
  • ID类型参数表示文档ID的类型。 Spring Data Solr(版本1.0.0.RC1)要求文档的ID为String

我们可以按照以下步骤创建存储库接口:

  1. 创建一个名为TodoDocumentRepository的接口。
  2. 扩展SolrCrudRepository接口,并提供我们的文档类的类型及其ID作为类型参数。

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

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

创建服务

下一步是创建使用创建的Solr存储库的服务。 我们可以按照以下步骤创建此服务:

  1. 创建服务接口。
  2. 实现创建的接口。

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

创建服务接口

我们的服务接口声明了以下两种方法:

  • void addToIndex(Todo todoEntry)方法将todo条目添加到索引。
  • void deleteFromIndex(Long id)方法从索引中删除待办事项。

注意:我们可以使用addToIndex()方法将新的待办事项添加到Solr索引中,并更新现有待办事项的信息。 如果现有文档的ID与新文档的ID相同,则将删除旧文档,并将新文档的信息保存到Solr索引中(有关更多详细信息 ,请参见SchemaXML @ Solr Wiki )。

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

public interface TodoIndexService {public void addToIndex(Todo todoEntry);public void deleteFromIndex(Long id);
}

实施创建的接口

我们通过执行以下步骤来实现服务接口:

  1. 创建我们的服务类的框架实现。
  2. 实现用于将文档添加到Solr索引的方法。
  3. 实现用于从Solr索引中删除文档的方法。

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

创建服务类的框架实现

我们可以按照以下步骤创建服务接口的框架实现:

  1. 创建一个名为RepositoryTodoIndexService的类,并使用@Service注释对该类进行注释。 该注释将该类标记为服务,并确保在类路径扫描期间将检测到该类。
  2. TodoDocumentRepository字段添加到RepositoryTodoIndexService类,并使用@Resource注释对该字段进行注释。 该注释指示Spring IoC容器将实际的存储库实现注入服务的存储库字段。

我们的虚拟服务实现的源代码如下所示:

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;@Service
public class RepositoryTodoIndexService implements TodoIndexService {@Resourceprivate TodoDocumentRepository repository;//Add methods here
}

将文档添加到Solr索引

我们可以按照以下步骤创建将新文档添加到Solr索引的方法:

  1. addToIndex()方法添加到RepositoryTodoIndexService类中,并使用@Transactional注释对该方法进行注释。 这确保了我们的Spring Data Solr存储库将参与Spring托管的事务 。
  2. 通过使用构建器模式创建一个新的TodoDocument对象。 设置创建的文档的id标题描述
  3. 通过调用TodoDocumentRepository接口的save()方法将文档添加到Solr索引中。

创建的方法的源代码如下所示:

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;@Service
public class RepositoryTodoIndexService implements TodoIndexService {@Resourceprivate TodoDocumentRepository repository;@Transactional@Overridepublic void addToIndex(Todo todoEntry) {TodoDocument document = TodoDocument.getBuilder(todoEntry.getId(), todoEntry.getTitle()).description(todoEntry.getDescription()).build();repository.save(document);}//Add deleteFromIndex() method here
}

从Solr索引中删除文档

我们可以按照以下步骤创建一种从Solr索引中删除文档的方法:

  1. deleteFromIndex()方法添加到RepositoryTodoDocumentService类,并使用@Transactional注释对该方法进行注释。 这确保了我们的Spring Data Solr存储库将参与Spring托管的事务 。
  2. 通过调用TodoDocumentRepository接口的delete()方法从Solr索引中删除文档。

创建的方法的源代码如下所示:

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;@Service
public class RepositoryTodoIndexService implements TodoIndexService {@Resourceprivate TodoDocumentRepository repository;//Add addToIndex() method here@Transactional@Overridepublic void deleteFromIndex(Long id) {repository.delete(id.toString());}
}

使用创建的服务

我们的最后一步是使用我们先前创建的服务。 我们可以通过对RepositoryTodoService类进行以下修改来做到这一点:

  1. TodoIndexService字段添加到RepositoryTodoService类,并使用@Resource批注对此字段进行批注。 该注释指示Spring IoC容器将创建的RepositoryTodoIndexService对象注入到服务的indexService字段中。
  2. 调用在RepositoryTodoService类的add()方法的TodoIndexService接口的addToIndex()方法。
  3. 调用在RepositoryTodoService类的deleteById()方法TodoIndexService接口的deleteFromIndex()方法。
  4. 调用在RepositoryTodoService类的update()方法的TodoIndexService接口的addToIndex()方法。

RepositoryTodoService的源代码如下所示:

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;
import java.util.List;@Service
public class RepositoryTodoService implements TodoService {@Resourceprivate TodoIndexService indexService;@Resourceprivate TodoRepository repository;@PreAuthorize("hasPermission('Todo', 'add')")@Transactional@Overridepublic Todo add(TodoDTO added) {Todo model = Todo.getBuilder(added.getTitle()).description(added.getDescription()).build();Todo persisted = repository.save(model);indexService.addToIndex(persisted);return persisted;}@PreAuthorize("hasPermission('Todo', 'delete')")@Transactional(rollbackFor = {TodoNotFoundException.class})@Overridepublic Todo deleteById(Long id) throws TodoNotFoundException {Todo deleted = findById(id);repository.delete(deleted);indexService.deleteFromIndex(id);return deleted;}@PreAuthorize("hasPermission('Todo', 'update')")@Transactional(rollbackFor = {TodoNotFoundException.class})@Overridepublic Todo update(TodoDTO updated) throws TodoNotFoundException {Todo model = findById(updated.getId());model.update(updated.getDescription(), updated.getTitle());indexService.addToIndex(model);return model;}
}

摘要

我们已经成功创建了一个应用程序,该应用程序将文档添加到Solr索引并从中删除文档。 这篇博客文章告诉我们以下内容:

  • 我们了解了如何创建文档类。
  • 我们了解到可以通过扩展SolrCrudRepository接口来创建Spring Data Solr存储库。
  • 我们了解到,Spring Data Solr默认情况下假设文档的id字段的名称为'id'。 但是,我们可以通过使用@Id注释对id字段进行注释来覆盖此设置。
  • 我们了解到,目前Spring Data Solr(版本1.0.0.RC1)期望文档的ID为String
  • 我们了解了如何向Solr索引添加文档以及从中删除文档。
  • 我们了解到,Spring Data Solr存储库可以参与Spring托管的事务。

我的Spring Data Solr教程的下一部分描述了如何使用查询方法从Solr索引中搜索信息 。

PS此博客条目的示例应用程序可从Github获得 。

参考: Spring Data Solr教程: Petri Kainulainen博客上来自我们的JCG合作伙伴 Petri Kainulainen的CRUD(几乎) 。

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

solr crud

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

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

相关文章

子类覆盖父类(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…

使用绝对布局的方法创建一个登录密码验证的简易窗口

绝对布局是指直接采用坐标指定的方式在容器中创建窗口&#xff0c;这种方式比较灵活 采用这种方法创建布局的方式主要有以下几步&#xff1a; 使用Container.setLayout(null)的方式取消布局管理器使用Compon.setBounds()的方式来设置每个组件的大小 下面先上代码 import ja…

Neo4j:Cypher –属性值只能是原始类型或其数组

本周初&#xff0c;当我尝试在我认为要共享的节点上创建数组属性时&#xff0c;遇到了一个有趣的Cypher错误消息。 这是我写的Cypher查询&#xff1a; CREATE (:Person {id: [1, "mark", 2.0]})导致此错误&#xff1a; Neo.ClientError.Statement.TypeError Prope…

通信工程制图期末考试大纲

通信工程建设的三个阶段 初步设计、技术设计、施工图设计 通信工程建设的参与方 1、建设单位&#xff1a;是建设工程的投资人&#xff0c;也称“业主"。 2、勘察单位&#xff1a;是指已通过建设行政主管部门的资质审查&#xff0c;从事工程测量、水文地质和岩土工程等工…

锁相环锁相原理简洁版

锁相环锁相原理 1.没有参考信号输入的时候&#xff0c;环路滤波器的输出为一个固定值&#xff0c;这是的VCO按照其固定的频率进行震荡 2.当有参考信号输入时&#xff0c;Ur和Uv同时加到鉴相器来鉴相&#xff0c;如果鉴相器fr和fv差别不大的话&#xff0c;这两个电压做差&#…

古诺模型_再见了古诺。 你好Drools工作台。

古诺模型Drools 6.0发生了许多变化。 随着功能和功能的更改&#xff0c;我们对Guvnor github存储库进行了重组&#xff0c;以更好地反映我们的新架构。 历史上&#xff0c;Guvnor一直是Drools的Web应用程序。 它由Drools专用的编辑器&#xff0c;后端存储库和简化的资产管理系统…

八千字复习一下天线与电磁波

1. 空间坐标系 空间直角坐标系&#xff08;常用&#xff09;极坐标系平面直角坐标系距离矢量就是空间向量坐标单位矢量就是给距离矢量xyz底下分别除以模长梯度就是xyz求偏导&#xff0c;记得写 ex⃗\vec{e_{x}}ex​​/ey⃗\vec{e_{y}}ey​​/ez⃗\vec{e_{z}}ez​​,最后方程左…

Apache Fluo:填充Google搜索索引的Percolator的实现

Apache Fluo是Apache Accumulo [3]的Percolator [2]&#xff08;填充Google的搜索索引&#xff09;的开源实现 。 使用Fluo&#xff0c;用户可以将新数据连续地合并到大型现有数据集中&#xff0c;而无需重新处理所有数据。 与批处理和流传输框架不同&#xff0c;Fluo提供了低得…

最通俗的语言讲解卷积码、码树图、状态图以及维特比译码

什么是卷积码&#xff1f; 卷积码是由伊利亚斯发明的一种非分组码&#xff0c;它更加倾向于纠错&#xff0c;对于实际的性能优于分组码&#xff0c;运算较为简单。 将卷积码记为(n,k,N),码率定义为k/n n是n个比特 k是k个信息位 N是N个信息段 卷积码编码器 组成&#xff1a…

通信系统的同步技术归纳

载波同步&#xff1a;在相干解调时&#xff0c;接收端的解调器要产生一个与接收到的载波同频同相的相干载波位同步&#xff1a;接收端产生一个与接收信号符号速率相同&#xff0c;相位与最佳判决时刻一致的定时脉冲序列信号群同步&#xff1a;群同步是指在接收端产生与“字、句…

c语言 在txt文件中搜索关键词_网络推广外包—网络推广外包如何在搜索引擎中体现关键词优化效果...

在当下的互联网时代中&#xff0c;没有企业愿意远离这种流量获取快、用户需求大、宣传推广能力见效快的搜索引擎&#xff0c;况且通过互联网的帮助下&#xff0c;企业网站能够通过搜索引擎进行关键词优化后获取更多的转化率&#xff0c;增加企业交易额度的提升&#xff0c;谁又…

Spring JPA数据+Hibernate+ MySQL + Maven

在Spring MVC的帮助下开发Web应用程序意味着要创建几个逻辑架构层。 层之一是DAO&#xff08;存储库&#xff09;层。 它负责与数据库进行通信。 如果您至少开发了DAO层一次&#xff0c;则应该知道它涉及许多样板代码。 Spring Data本身就是与DAO相关的日常工作的一部分。 在帖…

数字通信系统中的均衡技术

均衡技术是为了消除码间串扰的影响 自适应均衡器 可以自动调整抽头滤波系数的均衡器。包含两个工作模式&#xff0c;训练模式和跟踪模式&#xff1b; 训练模式&#xff1a;发射机发射一个已知的定长的序列&#xff0c;以便接收机处的均衡器可以做出正确的设置跟踪模式&#…

eclipse中birt插件使用_waves教学:如何使用通道条插件在DAW中创建模拟工作流

这篇Waves小文章将帮助你了解通道条插件如何来加快混音工作流程&#xff0c;同时还能在DAW中添加令人愉悦的模拟调音台染色——以及它们如何以前所未有的灵活性适应数字新时代。什么是通道条&#xff1f;第一次看到一台老式模拟调音台时&#xff0c;人们常常因为按键、旋钮和推…

X-Mas Musings –在Grails集成测试中不要使用随机服务器端口

对许多人来说&#xff0c;十二月是反思或思考的时期。 所以我决定在去年的事情和想法&#xff0c;以反映- 每一天 &#xff0c;直到圣诞节。 这是第四天 对于Grails集成测试&#xff0c;了解应用程序当前在哪个端口上运行非常有用。 Spring Boot以及因此建立在它上面的Grails都…

数字通信系统的分集技术

产生原因 无线信道的传输会被多个不同的因素干扰&#xff0c;增加辐射功率会对其他电台产生干扰&#xff0c;采用其他手段来处理数字信号 多径效应 直射波、反射波的传播路径不同&#xff0c;而且无线通信系统中接收端与发送端都是可以移动的&#xff0c;这就是多径效应。 …