栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Springboot实战:Elasticsearch搜索和分析引擎详细教程(附git源码下载)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Springboot实战:Elasticsearch搜索和分析引擎详细教程(附git源码下载)

Springboot-cli 开发脚手架系列

文章目录
  • Springboot-cli 开发脚手架系列
  • 简介
      • ` Springboot实战演示`
    • 环境
    • 1. 依赖
    • 2. elasticsearch客户端配置
    • 3. 业务场景模拟
    • 4. 效果测试
    • 6. 源码分享


简介
  • Elasticsearch 是一个分布式的 RESTful 搜索和分析引擎,可用来集中存储您的数据,以便您对形形色色、规模不一的数据进行搜索、索引和分析

  • 事实上 Elasticsearch 的完整栈有如下的几个:

    Beats 是一些轻量级可以允许在客户端服务器中的代理
    Elasticsearch是一个分布式的使用 REST 接口的搜索引擎。
    Kibana 针对es的ES的开源分析可视化工具
    Logstash的作用就是一个数据收集器,将各种格式各种渠道的数据通过它收集解析之后格式化输出到 Elasticsearch

  • Elasticsearch 安装

  • docker安装Elasticsearch : http://t.csdn.cn/3zkt4

  • 其它环境略

Springboot实战演示 环境
  • Elasticsearch 7.17.3
  • springboot 2.5.3
  • jdk 11(代码兼容jdk8)
1. 依赖
  • pom.xml 我这里springboot的版本为2.5.3
         
            org.projectlombok
            lombok
            true
        
       
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
        
            com.alibaba
            fastjson
            1.2.80
        
        
        
            org.springframework.boot
            spring-boot-starter-data-elasticsearch
        
  • yml 这里ip改为你实际的elasticsearch安装地址
elasticsearch:
  url: 192.168.41.128:9200
2. elasticsearch客户端配置
  • RestClientConfig 配置高级客户端
@Configuration
public class RestClientConfig extends AbstractElasticsearchConfiguration {

    @Value("${elasticsearch.url}")
    private String url;

    @Override
    @Bean
    public RestHighLevelClient elasticsearchClient() {
        final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
                .connectedTo(url)
                .build();
        return RestClients.create(clientConfiguration).rest();
    }

}
3. 业务场景模拟
  • 以用户增删改查为例子
  • 创建实体User
@Data
@Accessors(chain = true)
public class User {

    
    private Long userId;

    
    private String username;

    
    private String account;

    
    private String password;

    
    private Date createdDate;

}
  • 业务接口
public interface EsUserService {

    
    void createIndex() throws IOException;

    
    boolean indexExists(String indexName) throws IOException;

    
    void getIndex() throws IOException;

    
    void createUser(User user) throws IOException;

    
    void createUserBulk(List userList) throws IOException;

    
    User getUser(long userId) throws IOException;

    
    ArrayList searchUser() throws IOException;

    
    void updateUser(User user) throws IOException;

    
    void deleteUser(long userId) throws IOException;


}
  • ES实现类
@RequiredArgsConstructor
@Service
@Slf4j
public class EsUserServiceImpl implements EsUserService {

    private final RestHighLevelClient restHighLevelClient;

    private static final String USER_INDEX = "user_index";

    @Override
    public void createIndex() throws IOException {
        if (this.indexExists("test_index")) {
            return;
        }
        // 2 创建索引
        CreateIndexRequest createIndexRequest = new CreateIndexRequest("test_index");
        CreateIndexResponse response = restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
        log.info("创建成功,创建的索引名为:{}", response.index());
    }

    @Override
    public boolean indexExists(String indexName) throws IOException {
        GetIndexRequest getIndexRequest = new GetIndexRequest(indexName);
        boolean indexExists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
        if (indexExists) {
            log.warn("存在索引");
            return true;
        }
        return false;
    }

    @Override
    public void getIndex() throws IOException {
        // 1、构建 获取test_index索引的请求
        GetIndexRequest request = new GetIndexRequest("test_index");
        // 2、客户端判断该索引是否存在
        boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);
        log.info("该索引是否存在:{}", exists);
    }


    @Override
    public void createUser(User user) throws IOException {
        // 构建请求,创建索引
        IndexRequest request = new IndexRequest(USER_INDEX);
        request.id(String.valueOf(user.getUserId()));
        request.timeout(TimeValue.timeValueSeconds(5));
        // 保存的数据
        request.source(JSON.toJSONString(user), XContentType.JSON);
        // 客户端发送请求,获取响应结果
        IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
        log.info("响应结果:{}", response.toString());
    }

    @Override
    public void createUserBulk(List userList) throws IOException {
        // 构建批量插入的请求
        BulkRequest request = new BulkRequest();
        //设置超时时间
        request.timeout("10s");
        // 批量插入请求设置
        userList.forEach(user -> request.add(
                new IndexRequest("user_index")
                        .id(String.valueOf(user.getUserId()))
                        .source(JSONObject.toJSONString(user), XContentType.JSON)
        ));
        BulkResponse response = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
        log.info("批量插入结果:{}", !response.hasFailures());
    }

    @Override
    public User getUser(long userId) throws IOException {
        // 获取id为1的文档的信息
        GetRequest request = new GetRequest(USER_INDEX, String.valueOf(userId));
        boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
        // 如果存在,获取文档信息
        if (exists) {
            GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
            return JSON.parseObject(response.getSourceAsString(), User.class);
        }
        return null;
    }

    @Override
    public ArrayList searchUser() throws IOException {
        // 构建搜索请求
        SearchRequest request = new SearchRequest(USER_INDEX);
        // 设置搜索条件,使用该构建器进行查询
        SearchSourceBuilder builder = new SearchSourceBuilder();
        // QueryBuilders.termQuery():精确匹配
        // QueryBuilders.matchAllQuery():全文匹配
        // 构建精确匹配查询条件
        // TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("username.keyword", "李四");
        // MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
        // 模糊匹配
        WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("username", "张");
        builder.query(wildcardQueryBuilder);
        request.source(builder);
        SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        SearchHit[] hits = response.getHits().getHits();
        ArrayList users = new ArrayList<>();
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
            users.add(JSON.parseObject(hit.getSourceAsString(), User.class));
        }
        return users;
    }

    @Override
    public void updateUser(User user) throws IOException {
        // 通过索引更新
        UpdateRequest request = new UpdateRequest(USER_INDEX, String.valueOf(user.getUserId()));
        request.doc(JSONObject.toJSONString(user), XContentType.JSON);
        // 客户端执行更新请求
        UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
        log.info("更新状态:{}", response.status());
    }

    @Override
    public void deleteUser(long userId) throws IOException {
        DeleteRequest request = new DeleteRequest(USER_INDEX, String.valueOf(userId));
        DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
        log.info("删除状态:{}", response.status());
    }
}
4. 效果测试
  • 编写测试类
@SpringBootTest
@Slf4j
class DomeApplicationTests {

    @Autowired
    EsUserServiceImpl esUserService;

    
    @Test
    void createIndex() throws IOException {
        esUserService.createIndex();
        esUserService.getIndex();
    }

    
    @Test
    void createUser() throws IOException {
        User user = new User()
                .setUserId(1L)
                .setUsername("一鸣")
                .setAccount("admin1")
                .setCreatedDate(new Date())
                .setPassword("123456");
        esUserService.createUser(user);
    }

    
    @Test
    void createUserBulk() throws IOException {
        // 设置数据
        List list = new ArrayList<>();
        list.add(new User().setUserId(2L).setUsername("二狗子").setAccount("admin2").setCreatedDate(new Date()));
        list.add(new User().setUserId(3L).setUsername("张三").setAccount("admin3").setCreatedDate(new Date()));
        list.add(new User().setUserId(4L).setUsername("李四").setAccount("admin4").setCreatedDate(new Date()));
        list.add(new User().setUserId(5L).setUsername("王五").setAccount("admin5").setCreatedDate(new Date()));
        esUserService.createUserBulk(list);
    }

    
    @Test
    void getUser() throws IOException {
        User user = esUserService.getUser(1L);
        log.info("获取到用户为:{}", user);
    }

    
    @Test
    void searchUser() throws IOException {
        ArrayList users = esUserService.searchUser();
        log.info("查询结果{}", JSON.toJSONString(users));
    }

    
    @Test
    void updateUser() throws IOException {
        User user = new User()
                .setUserId(1L)
                .setUsername("一拳超人")
                .setAccount("admin1")
                .setCreatedDate(new Date())
                .setPassword("123456");
        esUserService.updateUser(user);
    }

    @Test
    void deleteUser() throws IOException {
        esUserService.deleteUser(1L);
    }
}
  • 部分效果演示
  1. 批量创建
  2. 条件查询
6. 源码分享
  • Springboot-cli开发脚手架,集合各种常用框架使用案例,完善的文档,致力于让开发者快速搭建基础环境并让应用跑起来。
  • 项目源码github地址
  • 项目源码国内gitee地址
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/919900.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号