SpringBoot集成Elasticseach

网友投稿 556 2022-05-29

目录

一、Elasticseach介绍

1.简单介绍

2.对比关系:

3.详细说明:

4.查出数据的解释

二、SpringBoot集成Elasticseach

1.引入依赖

2.添加配置

3.创建pojo类与索引对应

4.SpringData封装了基础的增删改查,自定义增删改查

5.测试方法--增删改查

如果本篇博客对您有一定的帮助,大家记得留言++哦。

一、Elasticseach介绍

1.简单介绍

官网:开源搜索:Elasticsearch、ELK Stack 和 Kibana 的开发者

ElasticSeach详细安装教程--图文介绍超详细: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的复数,代表许多的索引,

SpringBoot集成Elasticseach

类型(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.引入依赖

org.springframework.boot spring-boot-starter-data-elasticsearch org.springframework.boot spring-boot-starter-test test

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; /** * 品牌 */ @Field(type = FieldType.Keyword) private String brand; /** * 价格 */ @Field(type = FieldType.Double) private Double price; /** * 图片地址 */ @Field(type = FieldType.Keyword) 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) { this.id = id; this.title = title; this.category = category; this.brand = brand; this.price = price; this.images = 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 { List findByTitle(String title); List 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的模板类 @Autowired private ItemRepository itemRepository;//Item的增删改查 /** * 创建索引库 */ @Test public void testIndex(){ this.elasticsearchTemplate.createIndex(Item.class); this.elasticsearchTemplate.putMapping(Item.class); //this.elasticsearchTemplate.deleteIndex(); } /** * 插入与更新 */ @Test public void testCreate(){ Item item = new Item(1L,"小米手机9","手机","小米",3999.00,"https:www.baidu.com"); Object save = this.itemRepository.save(item); List 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 items = itemRepository.saveAll(list); System.out.println(items); } /** * 删除 */ @Test public void testDelete(){ Item item=new Item(1L,"小米手机9","手机","小米",3999.00,"https:www.baidu.com"); this.itemRepository.delete(item); } /** * 查询 */ @Test public void testFind(){ System.out.println("-----主键查询------"); Optional byId = this.itemRepository.findById(1L); System.out.println(byId.get()); System.out.println("-----查询全部------"); Iterable all = this.itemRepository.findAll(); all.forEach(i-> System.out.println(i)); System.out.println("-----排序查询(升序降序)------"); Iterable price = this.itemRepository.findAll(Sort.by("price").descending()); price.forEach(System.out::println); } /** * 调用自定义方法 */ @Test public void testFindByU(){ List phone = this.itemRepository.findByTitle("手机"); // phone.forEach(i->{ // System.out.println(i); // }); List byPriceBetween = this.itemRepository.findByPriceBetween(4000.0, 5000.0); byPriceBetween.forEach(i-> System.out.println(i)); } /** * 批量插入 */ @Test public void indexList() { List list = new ArrayList<>(); 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); } /** * 高级查询 */ @Test public void testSearch(){ //通过查询构建器工具构建--重点:QueryBuilders:词条、模糊、范围 MatchQueryBuilder queryBuilder= QueryBuilders.matchQuery("title","手机"); //获取结果集 Iterable items = this.itemRepository.search(queryBuilder); items.forEach(System.out::println); } /** * 重点--自定义查询 */ @Test public void testNative(){ // 构建自定义查询构建器 NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); // 添加基本查询条件 queryBuilder.withQuery(QueryBuilders.matchQuery("title","手机")); // 查询分页结果集 Page itemPage = this.itemRepository.search(queryBuilder.build()); System.out.println(itemPage.getTotalPages()); System.out.println(itemPage.getTotalElements()); itemPage.forEach(i-> System.out.println(i)); } /** * 重点--分页查询 */ @Test public void testPage(){ // 构建自定义查询构建器 NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); // 添加基本查询条件 queryBuilder.withQuery(QueryBuilders.matchQuery("category","手机")); queryBuilder.withPageable(PageRequest.of(1,2)); // 查询分页结果集 Page itemPage = this.itemRepository.search(queryBuilder.build()); System.out.println(itemPage.getTotalPages()); System.out.println(itemPage.getTotalElements()); itemPage.forEach(i-> System.out.println(i)); } /** * 重点--排序 */ @Test public void testSort(){ // 构建自定义查询构建器 NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); // 添加基本查询条件 queryBuilder.withQuery(QueryBuilders.matchQuery("category","手机")); queryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC)); // 查询分页结果集 Page itemPage = this.itemRepository.search(queryBuilder.build()); System.out.println(itemPage.getTotalPages()); System.out.println(itemPage.getTotalElements()); itemPage.forEach(i-> System.out.println(i)); } }

如果本篇博客对您有一定的帮助,大家记得留言++哦。

Elasticsearch 实时流计算服务 CS

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【已更新至day06】DevUI:7天玩转前端研发实战营
下一篇:网站开发进阶(二十五)js如何将html表格导出为excel文件
相关文章