Springboot整合ES
-
基本使用
-
官方api
- https://www.elastic.co/进入官网
- 找到Elasticsearch CLients 下的 Java REST Client[7.6]–other versions 并点击进去 [最为常用的restful风格的java客户端版本]
- 选择 JAVA High level Rest Client 一般都使用高级的客户端
- 找到原生的依赖,当然也可以直接在创建springboot工程的时候选择添加它依赖
-
编写配置类(cv即可)
- 交给spring管理
@Configuration public class ElasticSearchConfig { @Bean public RestHighLevelClient restHighLevelClient(){ RestHighLevelClient client = new RestHighLevelClient( RestClient.builder( new HttpHost("localhost", 9200, "http"))); return client; } }
- es文档curd操作
@Resource private RestHighLevelClient restHighLevelClient; //测试创建文档 把数据库得数据放进es索引库 添加操作:IndexRequest @Test void testCreateDoc() throws IOException { //数据库查询到出来的数据 Object data = dao.selectById(); //创建文档请求 这里举例:demo IndexRequest req = new IndexRequest("demo(自定义文档名称(也可以说当初是数据库的表名方便理解))"); //规则 put/索引名称/_doc/id值 req.id("1"); req.timeout(TimeValue.timeValueSeconds(1)); req.timeout("1s"); //将我们得数据放进请求 json数据 先转换成json数据 req.source(JSON.toJSONString(data), XContentType.JSON); //客户端发送请求 IndexResponse indices = restHighLevelClient.index(req,RequestOptions.DEFAULT); System.out.println(indices.toString()); System.out.println(indices.status()); } //获取文档的信息 查询操作 GetRequest @Test void testGetDocInfo() throws IOException { GetRequest re = new GetRequest("demo","1"); GetResponse documentFields = restHighLevelClient.get(re, RequestOptions.DEFAULT); System.out.println(documentFields.getSourceAsString()); System.out.println(documentFields); } //更新文档的信息 更新操作 UpdateRequest @Test void testGetDoc() throws IOException { UpdateRequest req = new UpdateRequest("demo", "1"); req.timeout("1s"); Object demoObj = dao.update(1); req.doc(JSON.toJSONString(demoObj),XContentType.JSON); UpdateResponse updateResponse = restHighLevelClient.update(req, RequestOptions.DEFAULT); System.out.println(updateResponse.status()); } //删除文档记录 @Test void testDeleteReq() throws IOException { DeleteRequest req = new DeleteRequest("demo", "1"); req.timeout("1s"); DeleteResponse delete = restHighLevelClient.delete(req, RequestOptions.DEFAULT); System.out.println(delete.status()); } //大批量添加数据进Es服务器 @Test void testBulkReq() throws IOException { BulkRequest bulkRequest = new BulkRequest(); bulkRequest.timeout("10s"); //数据库获取数据 List<User> userlist = dao.selectAll(); for (int i = 0; i < userlist.size(); i++) { //批量更新,批量删除就在这里更改对应的请求就可以了UpdateRequest DeleteRequest // bulkRequest.add(new UpdateRequest("demo") // bulkRequest.add(new DeleteRequest("demo") bulkRequest.add(new IndexRequest("demo") .id(""+i) .source(JSON.toJSONString(userlist.get(i)),XContentType.JSON)); } BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT); //是否执行失败,返回false代表成功 System.out.println(bulk.hasFailures()); } //批量查询和高亮查询 //例子 public List<Map<String,Object>> searchPageHighlight(String keyword,int pageNo,int pageSize) throws IOException { if (pageNo <= 0){ pageNo =1; } //1.条件搜索 SearchRequest searchRequest = new SearchRequest("数据库表名(如果是从数据库查放进es)"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); //分页 sourceBuilder.from(pageNo); sourceBuilder.size(pageSize); //精确匹配 TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", keyword); sourceBuilder.query(termQueryBuilder); sourceBuilder.timeout(new TimeValue(60,TimeUnit.SECONDS)); //设置高亮 HighlightBuilder highlightBuilder = new HighlightBuilder(); highlightBuilder.field("title"); //多个高亮关闭,true开启; highlightBuilder.requireFieldMatch(false); highlightBuilder.preTags("<span style='color:red'>"); highlightBuilder.postTags("</span>"); sourceBuilder.highlighter(highlightBuilder); //执行搜索获得es查询的响应结果 searchRequest.source(sourceBuilder); SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); //响应结果放进list ArrayList<Map<String,Object>> list = new ArrayList<>(); for (SearchHit hit : searchResponse.getHits().getHits()) { //解析高亮字段 Map<String, HighlightField> highlightFields = hit.getHighlightFields(); //获取自己设置的高亮标题 HighlightField title = highlightFields.get("title"); //获取到了原本source里面的所有map Map<String, Object> sourceAsMap = hit.getSourceAsMap(); //解析 将原来的字段换成我们定义的title高亮字段即可 if (title!=null){ Text[] fragments = title.fragments(); String highlighttitle = ""; for (Text text : fragments) { highlighttitle += text; } //替换成高亮的字段 利用了map特性 sourceAsMap.put("title",highlighttitle); } list.add(sourceAsMap); } return list; }
-
es 索引操作
//测试索引得创建 @Test void testCreateIndex() throws IOException { //1.新建索引请求 创建一个索引库 CreateIndexRequest req = new CreateIndexRequest("demo"); //2.客户端执行创建请求 CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(req, RequestOptions.DEFAULT); System.out.println(createIndexResponse); } //测试获取索引 判断索引是否存在 @Test void testGetIndex() throws IOException { GetIndexRequest request = new GetIndexRequest("demo"); //判断是否存在索引 System.out.println(restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT)); } //测试删除索引 @Test void testDeleteIndex() throws IOException { DeleteIndexRequest request = new DeleteIndexRequest("demo"); //删除 AcknowledgedResponse delete = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT); System.out.println(delete.isAcknowledged()); }
-