SpringBoot+ES實現增刪查改


小廣告...:https://www.mvclub.xyz/【個人搭建的一個電影網站】

任務要求

使用logstash將數據導入到ES中,並且實現增刪查改和分頁查詢

要求實現:

1、 功能一:搭建es環境

2、 功能二:將測試數據導入到mysql

3、 功能三:使用logstash將數據導入到ES

4、 功能四:SpringBoot整合ES

5、 功能五:增刪查改+高亮

6、 功能六:提供restful接口,並且使用postman測試接口

具體實現

功能一:

完成es搭建

https://www.cnblogs.com/IT_CH/p/12779770.html

功能二:

將測試數據導入到mysql中,測試數據是一個xlsx格式的數據

因為關注點不是這一部分,我們就直接使用Navicat直接將數據導入即可

代碼完成導入則參考:..............待完成

功能三:

使用logstash將數據導入到ES中

(1)先下載logstash-6.8.7,下載你的ES對應的版本,我使用的是6.8.7

(2)准備.conf腳本文件,對應將里面的一些修改完即可

注意:%{id}:你的表中必須要有這個字段,你的別的字段,相應的更換即可

input {

    stdin {}
    
    jdbc {
     
      jdbc_connection_string => "jdbc:mysql://localhost:3306/test1"
     
      jdbc_user => "root"
     
      jdbc_password => "root"
      
      jdbc_driver_library => "G:\repo\mysql\mysql-connector-java\5.1.47\mysql-connector-java-5.1.47.jar"
      jdbc_driver_class => "com.mysql.jdbc.Driver"
      jdbc_paging_enabled => "true"
      jdbc_page_size => "100000"
      
      statement => "select * from tb_totalcount"
     

      type => "jdbc"
    }
}
output {
    
    elasticsearch {
        hosts  => "127.0.0.1:9200"
        index => "test1"
        document_type => "user" 
        document_id => "%{id}" 

    }
    stdout {
        codec => json_lines
    } 


 }

(3)開始導入數據

(4)查看是否導入成功

功能四:

SpringBoot整合ES

(1)創建SpringBoot項目

(2)在pom.xml中添加一個分頁插件的依賴包

<!--分頁插件所需依賴包-->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.4</version>
</dependency>

(3)將自動生成的application.properties修改為application.yml,然后編寫

一定要注意空格.......

spring:
  data:
    elasticsearch:
      cluster-name: my-application  # 集群的名字,一定要和ES配置文件中的一致(elasticsearch.yml)
      cluster-nodes: 127.0.0.1:9300   # 當前服務器的IP地址 ==> ES有2個端口,Rest端口9200,Java請求端口9300
      repositories:
        enabled: true
# 解決跨域問題,在ES的elasticsearch.yml中最后兩行
http.cors.enabled: true
http.cors.allow-origin: "*"

(4)構建你的項目結構就OK了

注:PageUtil我使用了PageHelper插件,所以就不用添加了

如果你要自己寫分頁工具類,參考:https://www.cnblogs.com/IT_CH/p/12357660.html

其中有一個分頁工具類,粘貼即可用

功能五:

增刪查改+高亮查詢 -- 就直接貼代碼了,注釋代碼中都已添加

pojo

package com.blb.test1.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;

//准備一個實體類,實體類要和你的索引庫保持一致
@Data
@NoArgsConstructor
@AllArgsConstructor
/**
 * Doucment注解
 *    indexName:索引庫的名稱
 *    type:文檔的類型
 *    createIndex:是否創建索引
 * 如果要查詢的數據是中文的話,一般都需要配置中文分詞器,中文分詞器有2種
 *    ik_smart
 *    ik_max_word
 */
@Document(indexName = "test1",type = "user",createIndex = false)
//@Repository
public class User {

  @Id
  private long id;
  private String county_name;
  private String county_code;
  private String phone_id;
  private String user_type;
  private String brand;
  private String phone_type;
  private String is4G;
  private String conty_name;
  private String ishigh;
  private String user_id;
  private String total;
  private String range4G;
  @Field(value = "ik_max_word")
  private String classify;
  private String totals2G;
  private String totals3G;
  private String totals4G;
  private String lac_id;
  private String ccell_id;
  private String total_first;
  private String total_first_2G;
  private String total_first_3G;
  private String total_first_4G;
  private String total_sec_lacid;
  private String total_sec_cellid;
  private String total_sec;
  private String total_sec_2G;
  private String total_sec_3G;
  private String total_sec_4G;
  private String total_three_lacid;
  private String total_three_cellid;
  private String total_three;
  private String total_three_2G;
  private String total_three_3G;
  private String total_three_4G;

}

dao

package com.blb.test1.dao;

import com.blb.test1.pojo.User;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

//只要繼承了ElasticsearchRepository該類,那么該類就具有了增刪查改的方法
//<User,Long>:第一個參數表示為哪個類生成方法,第二個參數表示我們的主鍵類型
public interface UserDao extends ElasticsearchRepository<User,Long> {
}

service

package com.blb.test1.service;

import com.blb.test1.pojo.User;
import com.github.pagehelper.PageInfo;

import java.util.List;

public interface UserService {

    //增加
    boolean insertUser(User user);

    //刪除
    boolean RemoveUser(long id);

    //查找--單條數據查詢
    User queryById(long id);

    //條件查詢加分頁
    List<User> queryByPage(String keywords, int pageNow, int pageSize);

    //查詢條件+高亮顯示
    PageInfo queryByHighLight(String keywords, int pageNow, int pageSize);

    //修改
    boolean updateUser(User user);


}
package com.blb.test1.service.impl;

import com.blb.test1.dao.UserDao;
import com.blb.test1.pojo.User;
import com.blb.test1.service.UserService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MatchAllQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.SearchResultMapper;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;

import javax.swing.text.Highlighter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;

    @Override
    public boolean insertUser(User user) {
        return userDao.save(user).getId() > 0;
    }

    @Override
    public boolean RemoveUser(long id) {
        userDao.deleteById(id);
        return true;
    }

    @Override
    public User queryById(long id) {
        return userDao.findById(id).get();
    }

    //關鍵字查詢,關鍵字匹配classify字段
    @Override
    public List<User> queryByPage(String keywords, int pageNow, int pageSize) {
        List<User> users = new ArrayList<>();
        //先構建查詢條件
        BoolQueryBuilder query = QueryBuilders.boolQuery();
        /**
         * should 或;must 並;not must 非
         * matchQuery:字段匹配
         */
        query.should(QueryBuilders.matchQuery("classify",keywords));

        //分頁查詢
        PageRequest pageRequest = PageRequest.of(pageNow, pageSize,Sort.by(Sort.Order.asc("id")));
//        PageRequest pageRequest = PageRequest.of(pageNow, pageSize);

        //開始查詢
        Iterable<User> search = userDao.search(query, pageRequest);
        Iterator<User> userIterator = search.iterator();
        while (userIterator.hasNext()){
            users.add(userIterator.next());
        }
        return users;
    }

    //高亮查詢+分頁
    @Override
    public PageInfo queryByHighLight(String keywords, int pageNow, int pageSize) {
        //設置分頁的數據
        PageHelper.startPage(pageNow,pageSize);

        //構建查詢條件
        BoolQueryBuilder query = QueryBuilders.boolQuery();
        //如果還有別的要查詢的關鍵字,就繼續.should(QueryBuilders.matchQuery("你要查詢的字段",keywords))
        query.should(QueryBuilders.matchQuery("classify",keywords));

        //分頁
        PageRequest pageRequest = PageRequest.of(pageNow, pageSize,Sort.by(Sort.Order.asc("id")));

        //高亮設置
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.preTags("<em>")
                .postTags("</em>")
                .field("classify");

        //NativeSearchQueryBuilder 將多個條件組合在一起
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();

        //組合高亮顯示
        nativeSearchQueryBuilder.withHighlightBuilder(highlightBuilder);

        //組合分頁
        nativeSearchQueryBuilder.withPageable(pageRequest);

        //組合查詢條件
        nativeSearchQueryBuilder.withQuery(query);

        //也可以組合排序條件
//        nativeSearchQueryBuilder.withSort()

        //將查詢結果和我們的高亮結合起來
        //將數據查出來之后要轉化成什么類型的,最后一個參數就是用啦處理高亮的
        AggregatedPage<User> userList = elasticsearchTemplate.queryForPage(nativeSearchQueryBuilder.build(), User.class, new SearchResultMapper() {

            //將查詢的結果和我們要設置的高亮樣式結合起來
            @Override
            public <T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> aClass, Pageable pageable) {
                //先將數據用一個容器存放起來
                ArrayList<User> arrayList = new ArrayList<>();
                //我們查詢的結果都是放在searchResponse中的
                //我們現在就是要把我們想要的內容從searchResponse中獲取到
                SearchHits hits = searchResponse.getHits();
                //如果getTotalHits是0,則表示查詢不到數據
                if (hits.getTotalHits() <= 0) {
                    return null;
                }
                //從里面獲取一條一條的數據
                for (SearchHit hit : hits) {
                    User user = new User();
                    String classify = (String) hit.getSourceAsMap().get("classify");
                    //拿到數據之后,我們還要獲取到某個字段的高亮特征,高亮特征要和當前的數據做一個替換
                    HighlightField highlightField = hit.getHighlightFields().get("classify");
                    if (highlightField != null) {
                        user.setClassify(highlightField.fragments()[0].toString());
                    }
                    user.setClassify(classify);
                    arrayList.add(user);
                }
                return new AggregatedPageImpl(arrayList);
            }

            @Override
            public <T> T mapSearchHit(SearchHit searchHit, Class<T> aClass) {
                return null;
            }
        });
        //使用pageInfo對數據進行封裝
        PageInfo<User> pageInfo = new PageInfo<User>(userList.toList());
        return pageInfo;
    }

    @Override
    public boolean updateUser(User user) {
        return userDao.save(user).getId()>0;
    }
}

controller

package com.blb.test1.controller;

import com.blb.test1.pojo.User;
import com.blb.test1.service.UserService;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping(value = "/user")
@CrossOrigin("*")
public class UserController {
    
    @Autowired
    private UserService userService;
    
    @PostMapping("/insert")
    public Map insert(@RequestBody User user){
        HashMap map = new HashMap();
        userService.insertUser(user);
        map.put("msg","插入成功");
        map.put("status",true);
        map.put("code",0);
        return map;
    }

    @GetMapping("/delete/{id}")
    public Map delete(@PathVariable("id") int id){
        HashMap map = new HashMap();
        userService.RemoveUser(id);
        map.put("msg","刪除成功");
        map.put("status",true);
        map.put("code",0);
        return map;
    }

    @GetMapping("/select/{id}")
    public Map queryById(@PathVariable("id") int id){
        HashMap map = new HashMap();
        User user = userService.queryById(id);
        map.put("status",true);
        map.put("data",user);
        map.put("msg","查詢成功");
        map.put("code",0);
        return map;
    }

    @PostMapping("/search/{pageNow}/{pageSize}")
    public Map queryByKey(@RequestBody String keyword, @PathVariable("pageNow") int pageNow,@PathVariable("pageSize") int pageSize) throws UnsupportedEncodingException {
        //前台post傳輸的數據是中文的數據,通過debug方式看到它是一個編碼后的一個值
        //所以會出現匹配不到數據,所以我們要先將傳過來的數據進行解碼,不然就匹配不到
        //如果你沒匹配到,用debug模式查看是不是這個原因......
        String json=java.net.URLDecoder.decode(keyword,"UTF-8");
        System.out.print(json);
        HashMap map = new HashMap();
        List<User> list = userService.queryByPage(json, pageNow, pageSize);
        map.put("msg","查詢成功");
        map.put("data",list);
        map.put("code",0);
        map.put("count",list.size());
        return map;
    }

    @PostMapping("/searchHighLight/{pageNow}/{pageSize}")
    public Map queryByPageForHighLight(@RequestBody String keyword, @PathVariable("pageNow") int pageNow,@PathVariable("pageSize") int pageSize) throws UnsupportedEncodingException {
        //前台post傳輸的數據是中文的數據,通過debug方式看到它是一個編碼后的一個值
        //所以會出現匹配不到數據,所以我們要先將傳過來的數據進行解碼,不然就匹配不到
        //如果你沒匹配到,用debug模式查看是不是這個原因......
        String json=java.net.URLDecoder.decode(keyword,"UTF-8");
        System.out.print(json);
        HashMap map = new HashMap();
        PageInfo pageInfo = userService.queryByHighLight(json, pageNow, pageSize);
        map.put("msg","查詢成功");
        map.put("data",pageInfo.getList());
        map.put("code",0);
        map.put("count",pageInfo.getTotal());
        return map;
    }

}

啟動類

@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})

因為我的啟動有問題,如果不加該注解我的就啟動不起來

自己視情況定。

package com.blb.test1;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;

/**
 * https://blog.csdn.net/wcc27857285/article/details/90679424
 */
@SpringBootApplication
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class Test1Application {

    public static void main(String[] args) {
        SpringApplication.run(Test1Application.class, args);
    }

}

功能六:

提供restful接口,並且使用postman進行測試

由於懶,所以就沒測試添加和修改操作了,自己可以測試一下.......


OK...SpringBoot +ES的增刪查改已完成................

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM