springboot 集成elasticsearch
作者:互联网
百度云下载地址:链接:https://pan.baidu.com/s/11y5zGKJDsyb8f_ScLasPTQ
提取码:xut1
复制这段内容后打开百度网盘手机App,操作更方便哦
1、介绍 ElasticSearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索 引擎,基于 RESTfulweb 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的 开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索。稳 定,可靠,快速,安装使用方便官网:
2、准备工作: 电脑上面必须安装 javajdk 以及配置对应的环境变量 JDK 配置文档:
安装ElasticSearch之前的准备工作Jdk的安装bbs.itying.com
3,下载elasticsearchDownload Elasticsearch3下载elasticsearch
4,在任意目录下新建一个目录例如elasticsearch将下载的elasticsearch解压复制到该目录下
5,在dos命令里进入刚刚新建的elasticsearch下的bin运行elasticsearch.bat命令
6,在浏览器中输入loclahost:9200检测是否运行成功
7,安装配置中文分词工具下载地址:
https://github.com/medcl/elasticsearch-analysis-ik
https://github.com/medcl/elasticsearch-analysis-ik/releases
8,下载完后在plugins目录下新建一个ik目录
9,将下载下来的文件复制到该目录下
10,然后再运行elasticsearch.bat进行启动
pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
application.properties的配置
#名字必须和elasticsearch.yml里面的cluster.name相同 spring.data.elasticsearch.cluster-name=elasticsearch spring.data.elasticsearch.cluster-nodes=localhost:9300 spring.data.elasticsearch.repositories.enabled=true
注: 9300 是 Java 客户端的端口。9200 是支持 Restful HTTP 的接口。
更多的配置:
spring.data.elasticsearch.cluster-name Elasticsearch 集群名。(默认值: elasticsearch) spring.data.elasticsearch.cluster-nodes 集群节点地址列表,用逗号分隔。如果没有指定,就启动一个客户端节点。 spring.data.elasticsearch.propertie 用来配置客户端的额外属性。 spring.data.elasticsearch.repositories.enabled 开启 Elasticsearch 仓库。(默认值:true。)
代码编写
实体类
@Document(indexName = "userindex", type = "user") public class User implements Serializable{ /** * */ private static final long serialVersionUID = 1L; /** 编号 */ private Long id; /** 姓名 */ private String name; /** 年龄 */ private Integer age; /** 描述 */ private String description; /** 创建时间 */ private String createtm; // getter和setter 略 }
使用SpringData的时候,它需要在实体类中设置indexName 和type ,如果和传统型数据库比较的话,就相当于库和表。需要注意的是indexName和type都必须是小写!!!
dao层
public interface UserDao extends ElasticsearchRepository<User, Long>{ }
dao层这里就比较简单了,只需继承ElasticsearchRepository该类就行了。其中主要的方法就是 save、delete和search。其中save方法相当如insert和update,没有就新增,有就覆盖。delete方法主要就是删除数据以及索引库。至于search就是查询了,包括一些常用的查询,如分页、权重之类的。
Service层
import java.util.List; public interface UserService { public boolean insert(User user); public List<User> search(String searchContent); public List<User> searchUser(Integer pageNumber, Integer pageSize,String searchContent); public List<User> searchUserByWeight(String searchContent); }
ServiceImpl层
import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.QueryStringQueryBuilder; import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder; import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.data.web.SpringDataWebProperties; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.SearchQuery; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public boolean insert(User user) { boolean falg=false; try{ userDao.save(user); falg=true; }catch(Exception e){ e.printStackTrace(); } return falg; } @Override public List<User> search(String searchContent) { QueryStringQueryBuilder builder = new QueryStringQueryBuilder(searchContent); System.out.println("查询的语句:"+builder); Iterable<User> searchResult = userDao.search(builder); Iterator<User> iterator = searchResult.iterator(); List<User> list=new ArrayList<User>(); while (iterator.hasNext()) { list.add(iterator.next()); } return list; } @Override public List<User> searchUser(Integer pageNumber, Integer pageSize,String searchContent) { // 分页参数 // SpringDataWebProperties.Pageable pageable = new PageRequest(pageNumber, pageSize); // QueryStringQueryBuilder builder = new QueryStringQueryBuilder(searchContent); // SearchQuery searchQuery = new NativeSearchQueryBuilder().withPageable(pageable).withQuery(builder).build(); // System.out.println("查询的语句:" + searchQuery.getQuery().toString()); // Page<User> searchPageResults = userDao.search(searchQuery); return null; } @Override public List<User> searchUserByWeight(String searchContent) { // // 根据权重进行查询 // FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery() // .add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("name", searchContent)), // ScoreFunctionBuilders.weightFactorFunction(10)) // .add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("description", searchContent)), // ScoreFunctionBuilders.weightFactorFunction(100)).setMinScore(2); // System.out.println("查询的语句:" + functionScoreQueryBuilder.toString()); // Iterable<User> searchResult = userDao.search(functionScoreQueryBuilder); // Iterator<User> iterator = searchResult.iterator(); List<User> list=new ArrayList<User>(); // while (iterator.hasNext()) { // list.add(iterator.next()); // } return list; } }
这里我就简单的写了几个方法,其中主要的方法是查询。查询包括全文搜索,分页查询和权重查询。其中需要说明的是权重查询这块,权重的分值越高,查询的结果也越靠前,如果没有对其它的数据设置分值,它们默认的分值就是1,如果不想查询这些语句,只需使用setMinScore将其设为大于1即可。
Controller层
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController public class UserController { @Autowired public UserService userService; @PostMapping("insert") public boolean insert(@RequestBody User user){ System.out.println(); return userService.insert(user); } @GetMapping("search") public List<User> search(String searchContent){ return userService.search(searchContent); } public List<User> searchUser(Integer pageNumber, Integer pageSize,String searchContent){ return userService.searchUser(pageNumber,pageSize,searchContent); } public List<User> searchUserByWeight(String searchContent){ return userService.searchUserByWeight(searchContent); } }
代码测试
调用接口进行添加数据
新增数据:
localhost:8088/insert
{ "id": 1, "name": "张三", "age": 20, "description": null, "createtm": null }
进行全文查询
localhost:8088/search?searchContent=张
标签:集成,springboot,List,elasticsearch,org,import,public,searchContent 来源: https://blog.csdn.net/qq_32653205/article/details/111387344