其他分享
首页 > 其他分享> > springboot 集成elasticsearch

springboot 集成elasticsearch

作者:互联网

百度云下载地址:链接:https://pan.baidu.com/s/11y5zGKJDsyb8f_ScLasPTQ 
提取码:xut1 
复制这段内容后打开百度网盘手机App,操作更方便哦

1、介绍 ElasticSearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索 引擎,基于 RESTfulweb 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的 开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索。稳 定,可靠,快速,安装使用方便官网:

https://www.elastic.co/cn/

2、准备工作: 电脑上面必须安装 javajdk 以及配置对应的环境变量 JDK 配置文档:

安装ElasticSearch之前的准备工作Jdk的安装bbs.itying.com图标

3,下载elasticsearchDownload Elasticsearch3下载elasticsearch

https://www.elastic.co/cn/

4,在任意目录下新建一个目录例如elasticsearch将下载的elasticsearch解压复制到该目录下

img

img

5,在dos命令里进入刚刚新建的elasticsearch下的bin运行elasticsearch.bat命令

img

6,在浏览器中输入loclahost:9200检测是否运行成功

img

7,安装配置中文分词工具下载地址:

https://github.com/medcl/elasticsearch-analysis-ik

 

https://github.com/medcl/elasticsearch-analysis-ik/releases

8,下载完后在plugins目录下新建一个ik目录

img

9,将下载下来的文件复制到该目录下

img

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的时候,它需要在实体类中设置indexNametype ,如果和传统型数据库比较的话,就相当于。需要注意的是indexNametype都必须是小写!!!

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