es集成到java项目中
项目源码:https://gitee.com/lilinchun/es-project.git
首先有一个初始化的项目
第一步导入项目包
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>2.7.0</version>
</dependency>
<!-- 阿里巴巴的druid数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.23</version>
</dependency>
<!-- Mybatis-Plus 依赖配置 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
<exclusions>
<exclusion>
<artifactId>mybatis-plus-extension</artifactId>
<groupId>com.baomidou</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- mybatis-plus代码生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.1</version>
</dependency>
<!--es-->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
yml配置
server:
port: 8080
spring:
application:
name: es-service #\u9879\u76EE\u540D\u79F0
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://81.68.207.210:3306/blog?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
username: root
password: 123456
elasticsearch:
rest:
## ES 的地址
uris: 81.68.207.210:9200
index:
## 索引前缀
prefix: endpoint-authmanager
length: 7
es的仓库配置
package com.llc.dao;
import com.llc.es.BlogEs;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
public interface BlogRepository extends ElasticsearchRepository<BlogEs, String> {
}
package com.llc.es;
import lombok.Data;
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;
import java.util.Date;
/**
* @author lilinchun
* @date 2022/9/16 0016 17:22
*/
@Data
//llc_blog_new这个是创建的索引
@Document(indexName ="llc_blog_new" )
public class BlogEs {
@Id
@Field(type = FieldType.Long)
private Long blogId;
//标题
@Field(type = FieldType.Text)
private String title;
@Field(type = FieldType.Long)
private Long uid;
//内容
@Field(type = FieldType.Text)
private String content;
//创建时间
@Field(type = FieldType.Date)
private Date createTime;
//首图
@Field(type = FieldType.Text)
private String firstPicture;
//完成状态
@Field(type = FieldType.Text)
private String flag;
//点赞数
@Field(type = FieldType.Integer)
private Integer thumbs;
//发布状态
@Field(type = FieldType.Integer)
private Integer published;
//推荐状态
@Field(type = FieldType.Integer)
private Integer recommend;
//版权状态
@Field(type = FieldType.Text)
private String shareStatement;
//更新时间
@Field(type = FieldType.Date)
private Date updateTime;
//浏览次数
@Field(type = FieldType.Integer)
private Integer views;
@Field(type = FieldType.Long)
private Long typeId;
@Field(type = FieldType.Text)
private String description;
//赞赏状态
@Field(type = FieldType.Integer)
private Integer appreciation;
//评论状态
@Field(type = FieldType.Integer)
private Integer commentabled;
}
测试
package com.llc.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.api.ApiController;
import com.baomidou.mybatisplus.extension.api.R;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.llc.dao.BlogRepository;
import com.llc.entity.Blog;
import com.llc.es.BlogEs;
import com.llc.service.BlogService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.io.Serializable;
import java.util.List;
import java.util.Optional;
/**
* (Blog)表控制层
*
* @author makejava
* @since 2022-09-16 11:37:07
*/
@CrossOrigin
@RestController
@RequestMapping("blog")
public class BlogController extends ApiController {
/**
* 服务对象
*/
@Resource
private BlogService blogService;
@Resource
private BlogRepository blogRepository;
/**
* 分页查询所有数据
*
* @param page 分页对象
* @param blog 查询实体
* @return 所有数据
*/
@GetMapping
public R selectAll(Page<Blog> page, Blog blog) {
return success(this.blogService.page(page, new QueryWrapper<>(blog)));
}
/**
* 通过主键查询单条数据
*
* @param id 主键
* @return 单条数据
*/
@GetMapping("{id}")
public R selectOne(@PathVariable Serializable id) {
return success(this.blogService.getOne(new LambdaQueryWrapper<Blog>().eq(Blog::getBlogId,id)));
}
/**
* 新增数据
*
* @param blog 实体对象
* @return 新增结果
*/
@PostMapping
public R insert(@RequestBody Blog blog) {
return success(this.blogService.save(blog));
}
/**
* 修改数据
*
* @param blog 实体对象
* @return 修改结果
*/
@PutMapping
public R update(@RequestBody Blog blog) {
return success(this.blogService.updateById(blog));
}
/**
* 删除数据
*
* @param idList 主键结合
* @return 删除结果
*/
@DeleteMapping
public R delete(@RequestParam("idList") List<Long> idList) {
return success(this.blogService.removeByIds(idList));
}
@GetMapping("get")
public Blog getTitle(@RequestParam("blogId") String blogId) {
Blog vo=new Blog();
Optional<BlogEs> es = blogRepository.findById(blogId);
System.out.println("es中的数据---------"+es);
if (es.isPresent()) {
BlogEs blogEs = es.get();
BeanUtils.copyProperties(blogEs,vo);
}
return vo;
}
}
测试结果
这里需要注意导入的es包的版本不想同时配置是有一些差异的
我这里使用的版本
这使用的es版本:elasticsearch:6.8.13
kibana版本:kibana:6.8.13
canal版本:canal1.1.4
es中使用ElasticsearchRestTemplate进行查询
- 导包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.7.10</version>
</dependency>
- 示例
@Resource
private ElasticsearchRestTemplate template;
@Override
public List<EsCompany> findAuthedCompany(String companyName) {
restMemberClient.recordSearchHeat(companyName);
BoolQueryBuilder queryBuilder = boolQuery().must(matchQuery("companyName", companyName))
// 已认证
.must(termQuery("authStatus", "1"));
NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
.withQuery(queryBuilder)
// NativeSearchQuery 默认会分页(page 0,size 10)这里设置我关闭分页
.withTrackScores(true)
.build();
SearchHits<EsCompany> hits = template.search(nativeSearchQuery, EsCompany.class);
return hits.stream().map(SearchHit::getContent).collect(Collectors.toList());
}
es的需求示例
- 一个输入框同时查询手机号、姓名、企业名称
// ES搜索
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery()
.must(QueryBuilders.termsQuery("cardId", friendIds))
.must(QueryBuilders.boolQuery()
.should(QueryBuilders.multiMatchQuery(keyword, "realName", "companyName"))
.should(QueryBuilders.wildcardQuery("mobile", "*" + keyword + "*"))
);
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder()
// 查询条件
.withQuery(queryBuilder)
// 分页
.withPageable(PageRequest.of(Math.max(from - 1, 0), size));
SearchHits<EsMemberCard> hits = esTemplate.search(nativeSearchQueryBuilder.build(), EsMemberCard.class);
List<CardHolderSearchListVO> cards = hits.stream()
.map(hit -> BeanUtil.copy(hit.getContent(), CardHolderSearchListVO.class))
.collect(Collectors.toList());
return new PageVO<>(query.getCurrent(), query.getSize(), cards.size(), cards);
- should :类似sql中表示or
- wildcardQuery : 类似sql中的like
- multiMatchQuery:一个词匹配多个参数