说明
本篇文章将介绍SpringBoot整合ES如何实现全文搜索(较为简单)
ES相关工具安装以及数据同步是难点,教程请见上一篇。
开始编码
启动一个SpringBoot项目,并再pom中加入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
实体类代码
@data为Lombok提供的自动get、set、toStirng的插件注解
@Document(indexName = “demo”, type = “user”) 标识这个实体类为ES的一个实体,indexName为索引名,type为类型。
@id 表示把该字段设置为ES中的id
package jianjie.elasticsearch.pojo;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
/**
* @Description:
* @Author: 缪坚杰 jianjie.miao@luckincoffee.com
* @Date: 2019/8/31
*/
@Data
@Document(indexName = "demo", type = "user")
public class UserEntity {
@Id
private String id;
private String name;
private Integer sex;
private Integer age;
private String introduction;
}
数据接口层,继承ElasticsearchRepository<UserEntity,String>接口、包含基本的增删改查以及query查询。
package jianjie.elasticsearch.mapper;
import jianjie.elasticsearch.pojo.UserEntity;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
/**
* @Description:
* @Author: 缪坚杰 jianjie.miao@luckincoffee.com
* @Date: 2019/8/31
*/
public interface Repository extends ElasticsearchRepository<UserEntity,String> {
}
因为演示demo,所以直接上Controller层。
Controller代码
package jianjie.elasticsearch.controller;
import jianjie.elasticsearch.mapper.Repository;
import jianjie.elasticsearch.pojo.UserEntity;
import jianjie.elasticsearch.service.EsService;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Optional;
/**
* @Description:
* @Author: 缪坚杰 jianjie.miao@luckincoffee.com
* @Date: 2019/8/31
*/
@Slf4j
@RestController
public class EsController {
@Autowired
private Repository repository;
@RequestMapping("/addUser")
public UserEntity addUser(@RequestBody UserEntity userEntity) {
return repository.save(userEntity);
}
@RequestMapping("/findById")
public Optional<UserEntity> findById(String id) {
return repository.findById(id);
}
@RequestMapping("/matchByName")
public List<UserEntity> matchByName(String name) {
return esService.matchByName(name);
}
private String searchs = "";
@GetMapping("/search")
public String search(@RequestParam("searchKey") String searchKey) {
searchs = "";
// 构建查询条件
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
// 添加基本分词查询(多字段匹配)
queryBuilder.withQuery(QueryBuilders.multiMatchQuery(searchKey, "name", "introduction"));
// queryBuilder.withQuery(QueryBuilders.matchQuery("introduction", searchKey));
// 搜索,获取结果
Page<UserEntity> items = repository.search(queryBuilder.build());
// 总条数
long total = items.getTotalElements();
searchs += "总共数据数:" + total + "\n";
items.forEach(user -> {
searchs += user.toString() + "\n";
});
log.info(searchs);
return searchs;
}
}
search方法的创建query为全文搜索重点
queryBuilder.withQuery(QueryBuilders.multiMatchQuery(查询字段(入参), "检索字段名1", "检索字段名2"),... ...);
执行结果:
增
查
全文搜索
搜索结果_score约大的数据越靠前,可以根据这个来分每个字段的权重从而来做出复杂的推荐。 __end