ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

springboot 集成elasticsearch

2020-12-18 18:59:09  阅读:221  来源: 互联网

标签:集成 springboot List elasticsearch org import public searchContent


百度云下载地址:链接: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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有