小工具      在线工具  汉语词典  css  js  c++  java

Spring Data Elasticsearch 集成部分源码解析

Java 额外说明

收录于:42天前

Elasticsearch是一个基于Lucene的搜索服务器,主要是用于大数据、分布式系统中。

它提供了一个基于 RESTful Web 界面的分布式多用户全文搜索引擎。 Elasticsearch 采用 Java 开发并根据 Apache 许可条款作为开源发布,是一种流行的企业级搜索引擎。专为云计算应用而设计,可实现实时搜索,稳定、可靠、快速、易于安装和使用。

在进一步使用 Elasticsearch 之前,我们先了解一些关键概念。

在逻辑层面:

  • 指数:这里的 Index 是名词,一个 Index 就像是传统关系数据库的 Database,它是 Elasticsearch 用来存储数据的逻辑区域
  • 文档:Elasticsearch 使用 JSON 文档来表示一个对象,就像是关系数据库中一个 Table 中的一行数据
  • 类型:文档归属于一种 Type,就像是关系数据库中的一个 Table
  • 场地:每个文档包含多个字段,类似关系数据库中一个 Table 的列

我们用一个表格来比喻,如下:

弹性搜索 MySQL
指数 数据库
类型 桌子
文档
场地 柱子

在物理层面:

  • 节点:node 是一个运行着的 Elasticsearch 实例,一个 node 就是一个单独的 server
  • :cluster 是多个 node 的集合
  • 碎片:数据分片,一个 index 可能会存在于多个 shard

使用的方式主要两种:
① 一种是经过 SpringData 封装过的,直接在 dao 接口继承 ElasticsearchRepository 即可
② 一种是经过 Spring 封装过的,直接在 Service/Controller 中引入该 bean 即可,如下:

@Autowired
	ElasticsearchTemplate elasticsearchTemplate;

上一篇ES Demo的部分源码分析:

1.创建查询Bean实体

package com.elastic.bean;

import java.io.Serializable;
import java.util.Date;

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

/**
 * 通过注解配置,与Repository联用时,可以直接将数据结构映射到ElasticSearch上
 * index:是否设置索引, store是否存储数据,type:数据类型,analyzer:分词粒度选择,searchAnalyzer:查询进行分词处理
 *
 */
@Document(indexName = "stu", type = "doc")
public class Stu implements Serializable {

	private static final long serialVersionUID = 5388951762466627197L;

	@Id
	@Field(index=true, store = true, type = FieldType.Long)
	private Long id;

	@Field(index = true, analyzer = "ik_max_word", store = true, searchAnalyzer = "ik_max_word", type = FieldType.Text)
	private String stuId;

	@Field(index = true, analyzer = "ik_max_word", store = true, searchAnalyzer = "ik_max_word", type = FieldType.Text)
	private String stuName;

	@Field(index = true, store = true, type = FieldType.Date)
	private Date createTime;

	public Stu() {
	}
	
	public Stu(Long id, String stuId, String stuName, Date createTime) {
		this.id = id;
		this.stuId = stuId;
		this.stuName = stuName;
		this.createTime = createTime;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getStuId() {
		return stuId;
	}

	public void setStuId(String stuId) {
		this.stuId = stuId;
	}

	public String getStuName() {
		return stuName;
	}

	public void setStuName(String stuName) {
		this.stuName = stuName;
	}

	public Date getCreateTime() {
		return createTime;
	}

	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}
	
}

2、创建Dao层的StudentRepository

package com.elastic.repository;

import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

import com.elastic.bean.Stu;

@Repository
public interface StudentRepository extends ElasticsearchRepository<Stu, Long> {
	
	 /**
     * @param stuId
     * @return
     */
	List<Stu> getByStuId(String stuId);
	
    /**
     * @param stuName
     * @return
     */
    List<Stu> getListByStuName(String stuName);

    /**
     * @param stuName
     * @param pageable
     * @return
     */
    Page<Stu> getPageByStuName(String stuName, Pageable pageable);
    
}

3.EsServiceImp实现

主要包括两个方法:Dao接口继承、ElasticsearchRepository以及使用ElasticsearchTemplate模板方法进行ES的增删改查。

package com.elastic.service.imp;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import javax.annotation.Resource;

import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.IndexQuery;
import org.springframework.data.elasticsearch.core.query.IndexQueryBuilder;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.SearchQuery;
import org.springframework.stereotype.Service;

import com.elastic.bean.Stu;
import com.elastic.repository.StudentRepository;
import com.elastic.service.EsService;

@Service("esService ")
public class EsServiceImp implements EsService {


	/**
	 * 1. Dao层的StudentRepository
	 */
	@Resource
	private StudentRepository repository;

	/**
	 * 2. 模版方法
	 */
	@Autowired
	private ElasticsearchTemplate template;

	@Override
	public void save(Stu stu) {
		repository.save(stu);
	}

	@Override
	public Stu findById(Long id) {
		Stu rtn = null;
		Optional<Stu> stu = repository.findById(id);
		if (stu.isPresent()) {
			rtn = stu.get();
		}
		return rtn;
	}

	@Override
	public List<Stu> getByStuId(String stuId) {
		return repository.getByStuId(stuId);
	}

	@Override
	public List<Stu> getByStuName(String stuName) {
		return repository.getListByStuName(stuName);
	}


	// region Template Methods

	@Override
	public void save(String indexname, String type, Object obj) {
		IndexQuery indexquery = new IndexQueryBuilder()
				.withIndexName(indexname).withType(type).withObject(obj)
				.build();
		template.index(indexquery);
	}

	@Override
	public void delete(String indexname, String type, String id) {
		template.delete(indexname, type, id);
	}
	
	@Override
	public void update(String indexname, String type, Object obj) {
		IndexQuery indexquery = new IndexQueryBuilder()
				.withIndexName(indexname).withType(type).withObject(obj)
				.build();
		template.index(indexquery);
	}

	@Override
	public <T> List<T> findBySort(Class<T> clazz) {
		Sort sort = new Sort(Sort.Direction.DESC, "id");
		Pageable pageable = PageRequest.of(0, 10, sort);
		SearchQuery searchquery = new NativeSearchQueryBuilder()
				.withQuery(QueryBuilders.matchAllQuery())
				.withPageable(pageable).build();
		Page<T> items = template.queryForPage(searchquery, clazz);
		return items.getContent();
	}

	// endregion Template Methods

}

四:控制器测试

package com.elastic.controller;

import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.elastic.bean.Book;
import com.elastic.bean.Stu;
import com.elastic.service.EsService;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/es")
public class EsController {
    
   
   	/**
	 * 通过两种方法来增删改查ES的数据
	 * 
	 * 1. Dao 接口继承 ElasticsearchRepository
	 * 2. 使用ElasticsearchTemplate模版方法
	 */
	
	@Resource
	private EsService esService;
	
	// region Repository Methods

	
	@ResponseBody
	@RequestMapping(value = "/findByStuId", method = RequestMethod.GET)
	public List<Stu> findByStuId(String stuName){
		// 分页参数,排序
		Sort sort = new Sort(Sort.Direction.ASC, "id");
		Pageable pageable = PageRequest.of(0, 2, sort);
		List<Stu> listpages = esService.getPageByStuName(stuName, pageable);

		return listpages;
	}

	@RequestMapping(value = "/delete", method = RequestMethod.POST)
	public String delete(){
		Stu stu = esService.findById(7L);
		esService.delete(stu);

		return "删除成功";
	}
	
	// endregion Repository Methods
	
	// region Template Methods
	
	@RequestMapping(value = "/savebook", method = RequestMethod.POST)
	public String savebook(){
		String[] names = {"《西游记》","《红楼梦》","《三国演义》","《水浒传》","《西厢记》"};
		String[] persons = {"猴子","宝玉","曹操","武松","张生"};
		for(int i = 0; i < names.length; i++){
			Book book = new Book(i+1, names[i], persons[i]);
			esService.save("library", "book", book);
		}
		return "保存成功";
	}
	
	@RequestMapping(value = "/deletebook", method = RequestMethod.POST)
	public void deletebook(){
		Book book = new Book(1,"《西游记》","猪小戒");
		esService.delete("library", "book", String.valueOf(book.getId()));
	}
	
	@RequestMapping(value = "/updatebook", method = RequestMethod.POST)
	public void updatebook(){
		Book book = new Book(1,"《西游记》","猪小戒");
		esService.update("library", "book", book);
	}
	
	@RequestMapping(value = "/findbook", method = RequestMethod.POST)
	public void findbook(){
		List<Book> books = esService.findBySort(Book.class);
		System.out.println(books.size());
	}
	
	// endregion Template Methods
	
}

上面的源码下载地址请看之前的文章。

. . .

相关推荐

额外说明

MUI - 下拉刷新,上拉加载

前言 WEB界面,针对多个页面的数据请求显示,一般都采取分页查询显示的操作。 在APP中,也有类似的分页操作,其中使用最多的就是下拉刷新和上拉加载。 下拉刷新 在官方文档中,列举了嵌套webview或者单webview的方式实现下拉刷新操作。 但是配置起

额外说明

MySQL删除表操作(drop、delete和truncate的区别)

MySQL 删除表有一下几种情况: 1 drop table table_name : 删除表全部数据和表结构,会立刻释放磁盘的空间, 2 truncate table table_name : 删除表全部数据,保留表结构,立刻释放磁盘空间。(此时可以通

额外说明

详解-Spring请求处理

SpringMvc_请求处理 Spring MVC 框架也是一个基于请求驱动的 Web 框架,并且使用了前端控制器模式(是用来提供一个集中的请求处理机制,所有的请求都将由一个单一的处理程序处理来进行设计,再根据请求映射规则分发给相应的页面控制器(动作/处

额外说明

day05---(02)讲师管理模块准备(基本功能)

1、 创建vue组件与路由 (1) 创建vue组件 在在根目录下的src目录下的views目录下创建teacher目录,并在teacher目录下创建add.vue和list.vue文件。 Add.vue <template> <div class="

额外说明

【JAVA-Day09】 Java注释详解:一般注释、文档注释与最佳实践

Java注释详解:一般注释、文档注释与最佳实践 Java注释详解:一般注释、文档注释与最佳实践 摘要 引言 一、一般注释 1.1 块注释 1.2 单行注释 1.3 尾端注释 二、文档注释 三、注释的最佳实践 四、总结 参考资料 博主 默语带您 Go to

额外说明

字符串变形(字符串大小写切换和变现)

补充基本知识: JAVA中String类提供了转大写的方法toUpperCase()和转小写的方法toLowerCase() String a = "ABC"; system.out.println(a.toLowerCase());//abc Stri

额外说明

Flutter移动应用开发实战——常用布局组件

QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技am

额外说明

【Java 基础篇】Java网络编程详解

文章目录 导言 一、网络编程的概念 二、网络编程的原理 三、网络编程的常用技术 1. Socket编程 2. URL处理 3. HTTP客户端 总结 导言 在现代互联网时代,网络编程是一项至关重要的技术。Java作为一门广泛应用于网络开发的编程语言,提供

额外说明

MySQL 基础简介及配置

MySQL 四部曲 序号 文章 1 MySQL 环境搭建的四种方式 2 MySQL 基础简介及配置 3 MySQL基础语句 文章目录 1. MySQL 简介 1. 什么是数据库 2. 数据库的优点 3. 为什么选择 MySQL 4. 数据库的安装 2.

额外说明

History of the Great Game

文章目录 1. History of the Great Game (1) Stock Market - The Great Game (2) Courratiers De Change - France (3) Government Securitie

ads via 小工具