SpringBoot集成ElasticSearch的示例代码

2023-01-21 0 2,483

目录

 

一、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));
}

:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可, 转载请附上原文出处链接。
1、本站提供的源码不保证资源的完整性以及安全性,不附带任何技术服务!
2、本站提供的模板、软件工具等其他资源,均不包含技术服务,请大家谅解!
3、本站提供的资源仅供下载者参考学习,请勿用于任何商业用途,请24小时内删除!
4、如需商用,请购买正版,由于未及时购买正版发生的侵权行为,与本站无关。
5、本站部分资源存放于百度网盘或其他网盘中,请提前注册好百度网盘账号,下载安装百度网盘客户端或其他网盘客户端进行下载;
6、本站部分资源文件是经压缩后的,请下载后安装解压软件,推荐使用WinRAR和7-Zip解压软件。
7、如果本站提供的资源侵犯到了您的权益,请邮件联系: 442469558@qq.com 进行处理!

猪小侠源码-最新源码下载平台 Java教程 SpringBoot集成ElasticSearch的示例代码 http://www.20zxx.cn/463570/xuexijiaocheng/javajc.html

猪小侠源码,优质资源分享网

常见问题
  • 本站所有资源版权均属于原作者所有,均只能用于参考学习,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,建议提前注册好百度网盘账号,使用百度网盘客户端下载
查看详情

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务