小廣告...: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的增刪查改已完成................