SpringBoot集成ElasticSearch的示例代码
作者:小小张自由—>张有博 发布时间:2023-05-02 05:50:28
一、Elasticseach介绍
1.简单介绍
官网:开源搜索:Elasticsearch、ELK Stack 和 Kibana 的开发者 | Elastic
https://www.elastic.co/cn/
ElasticSeach详细安装教程--图文介绍超详细
令人记忆深刻的口号:能够发现意料之中以及意料之外的情况
Elasticsearch也是基于Lucene的全文检索库,本质也是存储数据,很多概念与MySQL类似的。是一种全文检索技术。
Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。Kibana 使您能够以交互方式探索、可视化和分享对数据的见解,并管理和监控堆栈。Elasticsearch 是索引、搜索和分析魔法发生的地方。
Elasticsearch 是一个基于JSON的分布式搜索和分析引擎。
Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
2.对比关系:
索引(indices)--------------------------------Databases 数据库
类型(type)-----------------------------Table 数据表
文档(Document)----------------Row 行
字段(Field)-------------------Columns 列
3.详细说明:
概念 | 说明 |
索引库(indices) | indices是index的复数,代表许多的索引, |
类型(type) | 类型是模拟mysql中的table概念,一个索引库下可以有不同类型的索引,比如商品索引,订单索引,其数据格式不同。不过这会导致索引库混乱,因此未来版本中会移除这个概念 |
文档(document) | 存入索引库原始的数据。比如每一条商品信息,就是一个文档 |
字段(field) | 文档中的属性 |
映射配置(mappings) | 字段的数据类型、属性、是否索引、是否存储等特性 |
4.查出数据的解释
took:查询花费时间,单位是毫秒
time_out:是否超时
_shards:分片信息
hits:搜索结果总览对象
total:搜索到的总条数
max_score:所有结果中文档得分的最高分
hits:搜索结果的文档对象数组,每个元素是一条搜索到的文档信息
_index:索引库
_type:文档类型
_id:文档id
_score:文档得分
_source:文档的源数据
二、SpringBoot集成Elasticseach
1.引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2.添加配置
spring:
data:
elasticsearch:
cluster-name: elasticsearch
cluster-nodes: 192.168.7.132:9300
3.创建pojo类与索引对应
package com.leyou.elasticsearch.pojo;
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;
/**
* 创建pojo类与索引对应
*
* @author Promsing(张有博)
* @version 1.0.0
* @since 2022/1/26 - 20:35
*/
@Document(indexName = "item", type = "docs", shards = 1, replicas = 0)
public class Item {
@Id
private Long id;
/**
* 标题
*/
@Field(type = FieldType.Text,analyzer = "ik_max_word")
private String title;
* 分类
@Field(type = FieldType.Keyword)
private String category;
* 品牌
private String brand;
* 价格
@Field(type = FieldType.Double)
private Double price;
* 图片地址
private String images;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
public String getTitle() {
return title;
public void setTitle(String title) {
this.title = title;
public String getCategory() {
return category;
public void setCategory(String category) {
this.category = category;
public String getBrand() {
return brand;
public void setBrand(String brand) {
this.brand = brand;
public Double getPrice() {
return price;
public void setPrice(Double price) {
this.price = price;
public String getImages() {
return images;
public void setImages(String images) {
this.images = images;
public Item() {
public Item(Long id, String title, String category, String brand, Double price, String images) {
@Override
public String toString() {
return "Item{" +
"id=" + id +
", title='" + title + '\'' +
", category='" + category + '\'' +
", brand='" + brand + '\'' +
", price=" + price +
", images='" + images + '\'' +
'}';
}
4.SpringData封装了基础的增删改查,自定义增删改查
这里需要继承接口-ItemRepository
/**
* 自定义的增删改查接口
*
* @author Promsing(张有博)
* @version 1.0.0
* @since 2022/1/27 - 15:10
*/
public interface ItemRepository extends ElasticsearchRepository<Item,Long> {
List<Item> findByTitle(String title);
List<Item> findByPriceBetween(Double d1,Double d2);
}
5.测试方法--增删改查
package com.leyou.elasticsearch;
import com.leyou.elasticsearch.dao.ItemRepository;
import com.leyou.elasticsearch.pojo.Item;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
/**
* 测试ES的增删改查
*
* @author Promsing(张有博)
* @version 1.0.0
* @since 2022/1/26 - 20:57
*/
@SpringBootTest(classes = ElasticsearchApplication.class)
@RunWith(SpringRunner.class)
public class ElasticsearchTest {
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;//ES的模板类
private ItemRepository itemRepository;//Item的增删改查
/**
* 创建索引库
*/
@Test
public void testIndex(){
this.elasticsearchTemplate.createIndex(Item.class);
this.elasticsearchTemplate.putMapping(Item.class);
//this.elasticsearchTemplate.deleteIndex();
}
* 插入与更新
public void testCreate(){
Item item = new Item(1L,"小米手机9","手机","小米",3999.00,"https:www.baidu.com");
Object save = this.itemRepository.save(item);
List<Item> list = new ArrayList<>();
list.add(new Item(2L, "坚果手机R1", " 手机", "锤子", 3699.00, "http://image.leyou.com/123.jpg"));
list.add(new Item(3L, "华为META10", " 手机", "华为", 4499.00, "http://image.leyou.com/3.jpg"));
// 接收对象集合,实现批量新增
Iterable<Item> items = itemRepository.saveAll(list);
System.out.println(items);
* 删除
public void testDelete(){
Item item=new Item(1L,"小米手机9","手机","小米",3999.00,"https:www.baidu.com");
this.itemRepository.delete(item);
* 查询
public void testFind(){
System.out.println("-----主键查询------");
Optional<Item> byId = this.itemRepository.findById(1L);
System.out.println(byId.get());
System.out.println("-----查询全部------");
Iterable<Item> all = this.itemRepository.findAll();
all.forEach(i-> System.out.println(i));
System.out.println("-----排序查询(升序降序)------");
Iterable<Item> price = this.itemRepository.findAll(Sort.by("price").descending());
price.forEach(System.out::println);
* 调用自定义方法
public void testFindByU(){
List<Item> phone = this.itemRepository.findByTitle("手机");
// phone.forEach(i->{
// System.out.println(i);
// });
List<Item> byPriceBetween = this.itemRepository.findByPriceBetween(4000.0, 5000.0);
byPriceBetween.forEach(i-> System.out.println(i));
* 批量插入
public void indexList() {
list.add(new Item(1L, "小米手机7", "手机", "小米", 3299.00, "http://image.leyou.com/13123.jpg"));
list.add(new Item(2L, "坚果手机R1", "手机", "锤子", 3699.00, "http://image.leyou.com/13123.jpg"));
list.add(new Item(3L, "华为META10", "手机", "华为", 4499.00, "http://image.leyou.com/13123.jpg"));
list.add(new Item(4L, "小米Mix2S", "手机", "小米", 4299.00, "http://image.leyou.com/13123.jpg"));
list.add(new Item(5L, "荣耀V10", "手机", "华为", 2799.00, "http://image.leyou.com/13123.jpg"));
itemRepository.saveAll(list);
* 高级查询
public void testSearch(){
//通过查询构建器工具构建--重点:QueryBuilders:词条、模糊、范围
MatchQueryBuilder queryBuilder= QueryBuilders.matchQuery("title","手机");
//获取结果集
Iterable<Item> items = this.itemRepository.search(queryBuilder);
items.forEach(System.out::println);
* 重点--自定义查询
public void testNative(){
// 构建自定义查询构建器
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
// 添加基本查询条件
queryBuilder.withQuery(QueryBuilders.matchQuery("title","手机"));
// 查询分页结果集
Page<Item> itemPage = this.itemRepository.search(queryBuilder.build());
System.out.println(itemPage.getTotalPages());
System.out.println(itemPage.getTotalElements());
itemPage.forEach(i-> System.out.println(i));
* 重点--分页查询
public void testPage(){
queryBuilder.withQuery(QueryBuilders.matchQuery("category","手机"));
queryBuilder.withPageable(PageRequest.of(1,2));
* 重点--排序
public void testSort(){
queryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC));
}
来源:https://blog.csdn.net/promsing/article/details/122876032
猜你喜欢
- Spring Boot文件上传与下载在实际的Web应用开发中,为了成功上传文件,必须将表单的method设置为post,并将enctype设
- 汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有n个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把
- 一、创建项目1.File->new->project;2.选择“Spring Initializr”,点击next;(jdk1.
- 一、实现原理使用MockMvc发起请求,然后执行API中相应的代码,在执行的过程中使mock模拟底层数据的返回,最后结果验证。二、常用注解介
- 1、 namenode启动在本系列文章三中分析了hadoop的启动文件,其中提到了namenode启动的时候调用的类为org.apache.
- 前言关于ThreadLocal (线程本地存储),从字面意思上看主要是存储一些本地变量,使它们能在一个线程内共用,与其他的线程进行数据隔离,
- 文件上传页面<%@ page language="java" contentType="text/htm
- 举例:存在一个类:Public Class Student{ public string name; public int age;}Stu
- 已知一副扑克牌有54张,去除大王和小王,剩余52张。在其中随机抽取4张牌,利用加减乘除进行计算得到24. 从A到10,他们的值分别为1到10
- 如下所示:# ===============================================================
- 本文实例讲述了Java基于享元模式实现五子棋游戏功能。分享给大家供大家参考,具体如下:一、模式定义享元模式,以共享的方式高效地支持大量的细粒
- 错误内容:com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis
- 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创
- 本文实例讲述了java获取中文拼音首字母工具类定义与用法。分享给大家供大家参考,具体如下:package com.sw.documentar
- Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。一、当两个并发线程访问同一个
- 关于页面渲染其实在工作中,一直都是前后端分离,也就是说,我的工作从来都是提供接口,而不写 html css js 之类的,所以在这方面也没有
- 持久层的那些事什么是 JDBCJDBC(JavaDataBase Connectivity)就是 Java 数据库连接, 说的直白点就是 使
- 缘起工作时使用java开发服务器后台,用Jersey写Restful接口,发现有一个Post方法始终获取不到参数,查了半天,发现时获取参数的
- 问题描述Spring Cache提供的@Cacheable注解不支持配置过期时间,还有缓存的自动刷新。我们可以通过配置CacheManneg
- 前言总是觉得对HashMap很熟悉,但最近连续被问到几个关于它的问题,才发现它其实并不简单。这里对关于它的一些问题做个总结,也希望能够大家一