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

Spring Data Elasticsearch 集成部分源码解析

Java 额外说明

收录于:93天前

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
	
}

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

. . .

相关推荐

额外说明

url的参数被解析成{key:value}的形式

    function parse(url) { const urlArr = url.split('?') const param = urlArr[1].split('&').map(item => item.split('='))

额外说明

Python爬虫入门基础学习(一)

大家好,我是卷心菜。因为项目的需要,最近在学习Python的爬虫。这一篇是关于Python的基础知识点,也是学习爬虫的入门知识点!如果您看完文章有所收获,可以三连支持博主哦~,嘻嘻。 文章目录 一、前言 二、注释 三、变量 四、标志符 五、关键字 六、基

额外说明

MySQL面试题之事务,锁机制,索引,范式

1、一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15? (1)如果表的类型是MyISAM,那么是18 因为MyISAM表会把自增主键的最大

额外说明

Python 第八节 第四课

[toc] 面向对象三大特征 Python 是面向对象的语言, 也支持面向对象编程的三大特征: 继承, 封装 ( 隐藏 ), 多态.  封装 ( 隐藏 )     隐藏对象的属性和实现细节, 值对外提供必要的方法. 相当于将 "细节封装起来", 只对外暴

额外说明

activity6快速部署流程文件

前言 工作中用到了activity6,个人觉得activity作为一款优秀的开源工作流引擎框架,得到众多企业的追捧而且经历了这么多年依然生命力不减值得花时间好好研究,接下来将通过几篇文章好好说说activity6 本篇是第一篇,聊聊怎么在本地快速将bpm

额外说明

【51单片机】点亮一个LED灯(看开发板原理图十分重要)

-专栏【51单片机】 -喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 -音乐分享【The Right Path】 -大一同学小吉,欢迎并且感谢大家指出我的问题- 目录   -基础内容 -️‍-sbit:特殊功能位声明 -️‍-注意 -方法一  -现象&&

额外说明

webpack打包Library库文件指南

本文示例仓库地址: https://github.com/liuchenyang0515/Library_pack 当自己写了一个js想让其他业务方引入,但是别人可能有很多种方式引入库文件,所以我们需要满足别人各种可能的引入方式。 可能是ES6 Modu

额外说明

手动使用typescript+webpack搭建react开发环境(一)

一、项目基础构建 1、创建一个文件,并且初始化 npm init -y tsc --init touch .gitignore 2、安装依赖包 # 基础的包 npm install react react-dom @types/react @types

额外说明

使用SQL索引需要注意的问题

在SQL查询语句中,想要提高我们查询的效率,则在表中创建索引是一个明智的选择,但是当我们使用不当时,索引也是会不起作用的。下面介绍几种在查询时导致索引失效的情况。 1、like模糊查询时尽量不要在索引列使用like"%name%"或者"%name"这种形

额外说明

Java封装:面向对象的三大特性之一

-栏目内容:Java 子夜的星的主页 -座右铭:前面的路并不远,一直走下去 目录 1、包装的概念2. 访问修饰符限定符3. 包装 1. 包的概念2.导入包中的类3. 常用包 你好!前面我们简单了解了什么是面向对象以及类和对象之间的关系。 想象一下,我们的

ads via 小工具