easy-es 使用

news2025/1/12 23:35:47

1、pom中引入依赖

 <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.14.0</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>7.14.0</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.14.0</version>
        </dependency>

        <dependency>
            <groupId>cn.easy-es</groupId>
            <artifactId>easy-es-boot-starter</artifactId>
            <version>2.0.0-beta1</version>
        </dependency>

2、yml文件增加配置

easy-es:
  address: 192.168.3.133:9210
  enable: true
  db-config:
    map-underscore-to-camel-case: true
    id-type: customize
    refresh-policy: immediate
    enable-track-total-hits: true

3、实体索引

package com.cn.es.entity;

import cn.easyes.annotation.HighLight;
import cn.easyes.annotation.IndexField;
import cn.easyes.annotation.IndexId;
import cn.easyes.annotation.IndexName;
import cn.easyes.annotation.rely.Analyzer;
import cn.easyes.annotation.rely.FieldType;
import cn.easyes.annotation.rely.IdType;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;

/**
 * description: ProductEntity <br>
 * date: 23.2.27 15:12 <br>
 * author: cn_yaojin <br>
 * version: 1.0 <br>
 */
@Setter
@Getter
@IndexName(value = "product_entity", shardsNum = 1, replicasNum = 1, aliasName = "Product")
//@Document(indexName = "product-index1", createIndex = true, type = "_doc")
public class ProductEntity {
    //id是业务中添加的,不是es自动生成的
    @IndexId(type = IdType.CUSTOMIZE)
    private Long id;

    @HighLight(mappingField = "resume", fragmentSize = 10)//将查询到的高亮内容放到resume字段中
    @IndexField(fieldType = FieldType.TEXT, analyzer = Analyzer.IK_MAX_WORD, searchAnalyzer = Analyzer.IK_SMART)
    private String name;

    //拼音分词
    @IndexField(fieldType = FieldType.TEXT, analyzer = Analyzer.PINYIN, searchAnalyzer = Analyzer.PINYIN)
    private String name1;

    //存放高亮
    @IndexField(exist = false)
    private String resume;


    @IndexField(fieldType = FieldType.KEYWORD)
    @ApiModelProperty(value = "销量")
    private Integer saleNum;

    @IndexField(fieldType = FieldType.KEYWORD)
    @ApiModelProperty(value = "价格")
    private Double price;

    /**
     * 品牌ID
     */
    @IndexField(fieldType = FieldType.LONG)
    private Long brandId;

    /**
     * 分类ID
     */
    @IndexField(fieldType = FieldType.LONG)
    private Long categoryId;

    /**
     * 店铺id
     */
    @IndexField(fieldType = FieldType.LONG)
    private Long shopId;

    @IndexField(fieldType = FieldType.KEYWORD)
    private Long addTime;



}

4、mapper

import cn.easyes.core.core.BaseEsMapper;
import com.cn.es.entity.ProductEntity;

public interface IProduc2Mapper extends BaseEsMapper<ProductEntity> {
}

5、service

package com.cn.es.service;

import cn.easyes.core.biz.EsPageInfo;
import cn.easyes.core.biz.SAPageInfo;
import cn.easyes.core.conditions.select.LambdaEsQueryWrapper;
import com.cn.es.entity.ProductEntity;
import com.cn.es.mapper.IProduc2Mapper;
import com.cn.es.vo.ProductSearch;
import com.cn.exception.MyException;
import com.cn.page.PageVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * description: Product2Service <br>
 * date: 23.3.20 14:29 <br>
 * author: cn_yaojin <br>
 * version: 1.0 <br>
 */
@Service
@Slf4j
public class Product2Service {

    @Autowired
    private IProduc2Mapper produc2Mapper;

    private String indexName = "product_entity";


    public void create() {
        boolean exist = this.produc2Mapper.existsIndex(indexName);
        if (!exist) {
            this.produc2Mapper.createIndex(indexName);
        } else {
            throw new MyException("索引已存在");
        }
    }

    public void drop() {
        boolean result = this.produc2Mapper.deleteIndex(indexName);
        System.out.println(result);
    }

    public void save(ProductEntity info) {
        info.setName1(info.getName()); //将商品名称放到name1拼音字段中

        info.setAddTime(System.currentTimeMillis());
        var data = this.produc2Mapper.selectById(info.getId());
        if (data != null) {
            update(info);
        } else {
            this.produc2Mapper.insert(info);
        }

    }

    public void update(ProductEntity info) {
        this.produc2Mapper.updateById(info);
    }

    public EsPageInfo<ProductEntity> page(PageVo<ProductSearch> pageVo) {
        ProductSearch search = pageVo.getParam();
        LambdaEsQueryWrapper<ProductEntity> queryWrapper = new LambdaEsQueryWrapper<>();
        if (StringUtils.isNotEmpty(search.getName())) {
//            queryWrapper.like("name", search.getName());
//            queryWrapper.matchPhrase(ProductEntity::getName, search.getName());
            queryWrapper.matchPhrase(ProductEntity::getName1, search.getName())
                    .or().matchPhrase(ProductEntity::getName, search.getName());

//            queryWrapper.multiMatchQuery("name", search.getName());
        }
        if (search.getPrice1() > -1) {
            queryWrapper.ge("price", search.getPrice1());
        }
        if (search.getPrice2() > -1) {
            queryWrapper.le("price", search.getPrice2());
        }

        if (search.getSortPrice()) {
            queryWrapper.orderByDesc("price");
        }
        if (search.getSortSaleNum()) {
            queryWrapper.orderByDesc("saleNum");
        }

        EsPageInfo<ProductEntity> page = this.produc2Mapper.pageQuery(queryWrapper, pageVo.getPageNum(), pageVo.getPageSize());
        return page;
    }

    public Object searchAfter(ProductSearch search) {
        LambdaEsQueryWrapper<ProductEntity> queryWrapper = new LambdaEsQueryWrapper<>();
        if (StringUtils.isNotEmpty(search.getName())) {

            queryWrapper.matchPhrase(ProductEntity::getName1, search.getName())
                    .or().matchPhrase(ProductEntity::getName, search.getName());
        }

        if (search.getPrice1() > -1) {
            queryWrapper.ge("price", search.getPrice1());
        }
        if (search.getPrice2() > -1) {
            queryWrapper.le("price", search.getPrice2());
        }

        queryWrapper.orderByDesc("id"); //以id为排序方式

        SAPageInfo<ProductEntity> saPageInfo = produc2Mapper.searchAfterPage(queryWrapper, search.getNextSearchAfter(), search.getSize());

        return saPageInfo;
    }


    public void del(String id) {
        this.produc2Mapper.deleteById(id);
    }

    public static void main(String[] args) {
        System.out.println(System.currentTimeMillis());
    }

}

6、controller

package com.cn.es.controller;

import cn.easyes.core.biz.EsPageInfo;
import cn.easyes.core.biz.SAPageInfo;
import com.cn.es.entity.ProductEntity;
import com.cn.es.service.Product2Service;
import com.cn.es.vo.ProductSearch;
import com.cn.msg.ResultMsg;
import com.cn.page.PageVo;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;


@RestController
@RequestMapping(value = "admin/product")
@Api(tags = "产品")
@Slf4j
public class ProductController {


    @Autowired
    private Product2Service product2Service;

    @ApiOperation(value = "新建索引")
    @GetMapping(value = "crate")
    public ResultMsg create() {
        this.product2Service.create();
        return ResultMsg.builder();
    }

    @ApiOperation(value = "删除索引")
    @GetMapping(value = "drop")
    public ResultMsg drop() {
        this.product2Service.drop();
        return ResultMsg.builder();
    }

    @ApiOperation(value = "保存")
    @PostMapping(value = "save")
    public ResultMsg save(
            @RequestBody ProductEntity info
    ) {
        this.product2Service.save(info);
        return ResultMsg.builder();
    }


    @ApiOperation(value = "easy-es 浅分页")
    @PostMapping(value = "page")
    public ResultMsg<EsPageInfo<ProductEntity>> page1(
            @RequestBody PageVo<ProductSearch> search
    ) {
        return ResultMsg.builder().setData(this.product2Service.page(search));
    }

    @ApiOperation(value = "easy-es searchAfter查询分页")
    @PostMapping(value = "page2")
    public ResultMsg<SAPageInfo<ProductEntity>> page2(
            @RequestBody ProductSearch search
    ) {
        return ResultMsg.builder().setData(this.product2Service.searchAfter(search));
    }

    @ApiOperation(value = "删除")
    @GetMapping(value = "del")
    public ResultMsg del(
            @RequestParam String id
    ) {
        this.product2Service.del(id);
        return ResultMsg.builder();
    }

}

7、新增或修改数据

{
  "brandId": 0,
  "categoryId": 1,
  "id": 8,
  "multiField": "",
  "name": "烤肉、啤酒",
  "price": 130,
  "saleNum": 124,
  "shopId": 1
}

8、浅分页

{
  "pageNum": 1,
  "pageSize": 20,
  "param": {
    "name": "",//支持拼音搜索:niurou
    "price1": -1,
    "price2": -1,
    "sortPrice": true,
    "sortSaleNum": true
  }
}

 9、searchAfter 分页,必须有一个唯一的排序属性,例如:id

{
  "name": "牛肉面",
  "size": 2 //查询2条
}

下一页:

{
  "name": "",
  "size": 2,
  "nextSearchAfter": [
    "7"
  ]
}

9、高亮查询

{
  "pageNum": 1,
  "pageSize": 20,
  "param": {
    "name": "牛肉面"
  }
}
{
  "msg": "成功",
  "data": {
    "total": 6,
    "list": [
      {
        "id": 5,
        "name": "牛肉面宽",
        "name1": "牛肉面宽",
        "resume": "<em>牛肉面</em>宽",
        "saleNum": 20,
        "price": 7,
        "brandId": 0,
        "categoryId": 1,
        "shopId": 1,
        "addTime": null
      },
      {
        "id": 1,
        "name": "牛肉面细",
        "name1": "牛肉面细",
        "resume": "<em>牛肉面</em>细",
        "saleNum": 7,
        "price": 7,
        "brandId": 0,
        "categoryId": 1,
        "shopId": 1,
        "addTime": null
      },
      {
        "id": 2,
        "name": "牛肉面毛细",
        "name1": "牛肉面毛细",
        "resume": "<em>牛肉面</em>毛细",
        "saleNum": 8,
        "price": 6,
        "brandId": 0,
        "categoryId": 1,
        "shopId": 1,
        "addTime": null
      },
      {
        "id": 3,
        "name": "牛肉面三细",
        "name1": "牛肉面三细",
        "resume": "<em>牛肉面</em>三细",
        "saleNum": 10,
        "price": 6.5,
        "brandId": 0,
        "categoryId": 1,
        "shopId": 1,
        "addTime": null
      },
      {
        "id": 4,
        "name": "牛肉面二细",
        "name1": "牛肉面二细",
        "resume": "<em>牛肉面</em>二细",
        "saleNum": 31,
        "price": 7.5,
        "brandId": 0,
        "categoryId": 1,
        "shopId": 1,
        "addTime": null
      },
      {
        "id": 6,
        "name": "牛肉面大宽",
        "name1": "牛肉面大宽",
        "resume": "<em>牛肉面</em>大宽",
        "saleNum": 10,
        "price": 7,
        "brandId": 0,
        "categoryId": 1,
        "shopId": 1,
        "addTime": null
      }
    ],
    "pageNum": 1,
    "pageSize": 20,
    "size": 6,
    "startRow": 0,
    "endRow": 5,
    "pages": 1,
    "prePage": 0,
    "nextPage": 0,
    "hasPreviousPage": false,
    "hasNextPage": false,
    "navigatePages": 8,
    "navigatePageNums": [
      1
    ],
    "navigateFirstPage": 1,
    "navigateLastPage": 1,
    "firstPage": true,
    "lastPage": true
  },
  "success": true,
  "code": 200
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/897325.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS ens160 显示disconnected

使用nmcli device查看网卡状态&#xff0c;显示如图&#xff1a; 检查宿主机系统VMware DHCP Sevice和VMware NAT Sevice服务是否正常运行。 右键点击我的电脑管理按钮&#xff0c;打开计算机管理点击服务

C语言实例_异或校验算法

一、异或校验算法 异或校验算法&#xff08;XOR校验&#xff09;是一种简单的校验算法&#xff0c;用于检测数据在传输或存储过程中是否发生了错误。通过将数据中的所有比特位相异或&#xff0c;生成一个校验码&#xff0c;然后将该校验码与接收到的数据进行比较&#xff0c;以…

如何大幅提高遥感影像分辨率(Python+MATLAB)

前言: 算法:NSCT算法(非下采样变换) 数据:Landsat8 OLI 遥感图像数据 编程平台:MATLAB+Python 论文参考:毛克.一种快速的全色和多光谱图像融合算法[J].测绘科学,2016,41(01):151-153+98.DOI:10.16251/j.cnki.1009-2307.2016.01.028. 左图:未进行融合的多光谱真彩色合…

ChatGPT逐句逐句地解释代码并分析复杂度的提示词prompt

前提安装chrome 插件 AI Prompt Genius&#xff0c; 请参考 3 个 ChatGPT 插件您需要立即下载 你是首席软件工程师。请解释这段代码&#xff1a;{{code}} 添加注释并重写代码&#xff0c;用注释解释每一行代码的作用。最后分析复杂度。快捷键 / 选择 Explain Code 输入代码提…

内网隧道代理技术(十七)之 NPS的使用

NPS的介绍和使用 NPS介绍 nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还支持内网http代理、内网socks5代理、p2p等,…

RFID技术助力汽车零配件装配产线,提升效率与准确性

随着科技的不断发展&#xff0c;越来越多的自动化设备被应用到汽车零配件装配产线中。其中&#xff0c;射频识别&#xff08;Radio Frequency Identification&#xff0c;简称RFID&#xff09;技术凭借其独特的优势&#xff0c;已经成为了这一领域的重要技术之一。本文将介绍RF…

Cpp基础Ⅰ之编译、链接

1 C是如何工作的 工具&#xff1a;Visual Studio 1.1 预处理语句 在.cpp源文件中&#xff0c;所有#字符开头的语句为预处理语句 例如在下面的 Hello World 程序中 #include<iostream>int main() {std::cout <"Hello World!"<std::endl;std::cin.get…

宝塔部署Java+Vue前后端分离项目经验总结

前言 之前部署服务器都是在Linux环境下自己一点一点安装软件&#xff0c;听说用宝塔傻瓜式部署更快&#xff0c;这次浅浅尝试了一把。 确实简单&#xff01; 1、 买服务器 咋买服务器略&#xff0c;记得服务器装系统就装 Cent OS 7系列即可&#xff0c;我装的7.6。 2、创建…

私密数据采集:隧道爬虫IP技术的保密性能力探究

作为一名专业的爬虫程序员&#xff0c;今天要和大家分享一个关键的技术&#xff0c;它能够为私密数据采集提供保密性能力——隧道爬虫IP技术。如果你在进行敏感数据采集任务时需要保护数据的私密性&#xff0c;那么这项技术将是你的守护神。 在进行私密数据采集任务时&#xff…

曲面(弧面、柱面)展平(拉直)瓶子标签识别ocr

瓶子或者柱面在做字符识别的时候由于变形&#xff0c;识别效果是很不好的 或者是检测瓶子表面缺陷的时候效果也没有展平的好 下面介绍两个项目&#xff0c;关于曲面&#xff08;弧面、柱面&#xff09;展平&#xff08;拉直&#xff09; 项目一&#xff1a;通过识别曲面的6个点…

报名开启 | HarmonyOS第一课“营”在暑期系列直播

<HarmonyOS第一课>2023年再次启航&#xff01; 特邀HarmonyOS布道师云集华为开发者联盟直播间 聚焦HarmonyOS 4版本新特性 邀您一同学习赢好礼&#xff01; 你准备好了吗&#xff1f; ↓↓↓预约报名↓↓↓ 点击关注了解更多资讯&#xff0c;报名学习

[C++]笔记-制作自己的静态库

一.静态库的创建 在项目属性c/c里面,选用无预编译头,创建头文件与cpp文件,需要注意release模式下还是debug模式,在用库时候要与该模式相匹配,库的函数实现是外界无法看到的,最后在要使用的项目里面导入.h文件和.lib文件 二.使用一个循环给二维数组赋值 行数 : 第几个元素 / …

一文带你了解CMS收集器:并发低停顿收集器

一、工作流程 CMS&#xff08;Concurrent Mark Sweep&#xff09;收集器是一种以获取最短回收停顿时间为目标的收集器。互联网网站或者基于B/S系统&#xff08;B/S系统是指Browser/Server系统&#xff0c;也就是基于浏览器和服务器的系统架构&#xff09;的服务端应用通常会关…

ADC静态特性测试

测试环境搭建&#xff1a; 码密度分析法的局限性 更新&#xff1a; MATLAB R2020a之后的版本&#xff0c;更新了函数 “inldnl()”&#xff0c;可以自动计算INL和DNL。具体用法看MATLAB说明文档即可。

Linux —— 进程间通信

目录 一&#xff0c;进程间通信 二&#xff0c;管道 匿名管道 命名管道 一&#xff0c;进程间通信 进程间通信&#xff08;IPC&#xff0c;InterProcess Communication&#xff09;&#xff0c;即在不同进程之间进行信息的传播或交换&#xff1b;由于一般进程用户地址空间是…

C++ STL容器适配器(详解)

STL容器适配器 什么是适配器&#xff0c;C STL容器适配器详解 在详解什么是容器适配器之前&#xff0c;初学者首先要理解适配器的含义。 其实&#xff0c;容器适配器中的“适配器”&#xff0c;和生活中常见的电源适配器中“适配器”的含义非常接近。我们知道&#xff0c;无…

Python土力学与基础工程计算.PDF-螺旋板载荷试验

python 求解代码如下&#xff1a; 1. import numpy as np 2. 3. # 已知参数 4. p_a 100 # 标准压力&#xff0c; kPa 5. p np.array([25, 50, 100, 200) # 荷载&#xff0c; kPa 6. s np.array([2.88, 5.28, 9.50, 15.00) / 10 # 沉降量&#xff0c; cm 7. D 10 # 螺旋板直…

opencv直方图与模板匹配

import cv2 #opencv读取的格式是BGR import numpy as np import matplotlib.pyplot as plt#Matplotlib是RGB %matplotlib inline def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows() 直方图 cv2.calcHist(images,channels,mask,histSize,ran…

2023-8-18 最长连续不重复子序列

题目链接&#xff1a;最长连续不重复子序列 #include <iostream>using namespace std;const int N 100010; int n; int a[N], s[N];int main () {cin >> n;for(int i 0; i < n; i ) cin >> a[i];int res 0;for(int i 0, j 0; i < n; i){s[a[i]];w…