SpringBoot集成ElasticSearch的示例代码

网友投稿 917 2022-10-30

SpringBoot集成ElasticSearch的示例代码

SpringBoot集成ElasticSearch的示例代码

目录一、Elasticseach介绍1.简单介绍2.对比关系:3.详细说明:4.查出数据的解释 二、SpringBoot集成Elasticseach1.引入依赖2.添加配置3.创建pojo类与索引对应4.SpringData封装了基础的增删改查,自定义增删改查5.测试方法--增删改查

一、Elasticseach介绍

1.简单介绍

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

https://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.引入依赖

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;

* 品牌

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 + '\'' +

oHJYw ", 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的模板类

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: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);

* 删除

public void testDelete(){

Item item=new Item(1L,"小米手机9","手机","小米",3999.00,"https:baidu.com");

this.itemRepository.delete(item);

* 查询

public void testFind(){

System.out.println("-----主键查询------");

Optionhttp://al 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);

* 调用自定义方法

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));

* 批量插入

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 items = this.itemRepository.search(queryBuilder);

items.forEach(System.out::println);

* 重点--自定义查询

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));

* 重点--分页查询

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));

}

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

上一篇:Micro Lisp - 用不到200行的C代码实现一个非常小的Lisp编程语言
下一篇:Python3爬虫系列的理论验证,比较同步依序下载、多进程并发、多线程并发和asyncio异步编程之间的效率差别
相关文章

 发表评论

暂时没有评论,来抢沙发吧~