From 82b4337542b033daa9e6d47dabc39b8a704826f7 Mon Sep 17 00:00:00 2001 From: daihh Date: Sat, 7 Jan 2023 11:43:17 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=BE=E7=A8=8B=E5=AD=A6=E4=B9=A0=E7=9A=84ES?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../elasticsearc/CourseElasticsearchImpl.java | 1 - .../CourseStudyElasticsearchImpl.java | 232 ++++++++++++++++++ 2 files changed, 232 insertions(+), 1 deletion(-) create mode 100644 modules/boe-module-es/src/main/java/com/xboe/module/elasticsearc/CourseStudyElasticsearchImpl.java diff --git a/modules/boe-module-es/src/main/java/com/xboe/module/elasticsearc/CourseElasticsearchImpl.java b/modules/boe-module-es/src/main/java/com/xboe/module/elasticsearc/CourseElasticsearchImpl.java index 81a59fea..9b1764e1 100644 --- a/modules/boe-module-es/src/main/java/com/xboe/module/elasticsearc/CourseElasticsearchImpl.java +++ b/modules/boe-module-es/src/main/java/com/xboe/module/elasticsearc/CourseElasticsearchImpl.java @@ -394,7 +394,6 @@ public class CourseElasticsearchImpl implements ICourseFullTextSearch{ if(StringUtils.isNotBlank(params.getKeywords())) { - String words=QueryParser.escape(params.getKeywords()); // System.out.println(params.getKeywords()); diff --git a/modules/boe-module-es/src/main/java/com/xboe/module/elasticsearc/CourseStudyElasticsearchImpl.java b/modules/boe-module-es/src/main/java/com/xboe/module/elasticsearc/CourseStudyElasticsearchImpl.java new file mode 100644 index 00000000..f327cf7b --- /dev/null +++ b/modules/boe-module-es/src/main/java/com/xboe/module/elasticsearc/CourseStudyElasticsearchImpl.java @@ -0,0 +1,232 @@ +package com.xboe.module.elasticsearc; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import javax.annotation.Resource; + +import org.apache.commons.lang3.StringUtils; +import org.apache.lucene.queryparser.classic.QueryParser; +import org.elasticsearch.action.DocWriteResponse; +import org.elasticsearch.action.delete.DeleteRequest; +import org.elasticsearch.action.delete.DeleteResponse; +import org.elasticsearch.action.get.GetRequest; +import org.elasticsearch.action.index.IndexRequest; +import org.elasticsearch.action.index.IndexResponse; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.support.replication.ReplicationResponse; +import org.elasticsearch.action.update.UpdateRequest; +import org.elasticsearch.action.update.UpdateResponse; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.client.indices.CreateIndexRequest; +import org.elasticsearch.client.indices.CreateIndexResponse; +import org.elasticsearch.common.unit.TimeValue; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.SearchHits; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.springframework.stereotype.Service; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.xboe.common.PageList; +import com.xboe.module.course.dto.CourseFullText; +import com.xboe.module.course.dto.CourseStudyDto; +import com.xboe.module.course.service.ICourseStudySearch; + +import lombok.extern.slf4j.Slf4j; + +/** + * 课程学习的ES实现 + * @author seastar + * + */ +@Slf4j +@Service +public class CourseStudyElasticsearchImpl implements ICourseStudySearch{ + + @Resource + RestHighLevelClient restHighLevelClient; + + @Resource + ElasticsearchUtil esUtil; + + @Override + public void createIndex() throws Exception{ + boolean isExists = esUtil.isIndexExists(IndexName); + if(isExists) { + throw new Exception("索引已存在"); + } + XContentBuilder builder = XContentFactory.jsonBuilder(); + builder.startObject(); + builder.field("properties").startObject(); + builder.field("id").startObject().field("index", "true").field("type", "keyword").endObject(); + builder.field("accountId").startObject().field("type", "keyword").endObject(); + builder.field("courseId").startObject().field("type", "keyword").endObject(); + builder.field("courseName").startObject().field("type", "keyword").endObject(); + builder.field("courseImage").startObject().field("type", "keyword").endObject(); + builder.field("courseType").startObject().field("type", "integer").endObject(); + builder.field("source").startObject().field("type", "integer").endObject(); + builder.field("startTime").startObject().field("type", "integer").endObject(); + builder.field("status").startObject().field("type", "integer").endObject(); + builder.field("progress").startObject().field("type", "integer").endObject(); + builder.endObject(); + builder.endObject(); + + CreateIndexRequest createIndexRequest = new CreateIndexRequest(IndexName); + createIndexRequest.mapping(builder); + CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT); + boolean acknowledged = createIndexResponse.isAcknowledged(); + if (!acknowledged) { + log.error("创建课程学习索引失败",createIndexResponse); + throw new Exception("创建索引失败"); + } + + } + + @Override + public void deleteIndex() { + esUtil.deleteIndex(IndexName); + } + + @Override + public String publishOrUpdate(CourseStudyDto dto,String docId) throws IOException { + + boolean exists=false; + if(StringUtils.isNotBlank(docId)) { + GetRequest getRequest=new GetRequest(IndexName,docId); + exists = restHighLevelClient.exists(getRequest, RequestOptions.DEFAULT); + } + //System.out.println(item.getName()+"="+item.getType()); + if(exists) { + UpdateRequest updateRequest = new UpdateRequest(IndexName, docId); + ObjectMapper mapper=new ObjectMapper(); + String textJson =mapper.writeValueAsString(dto); + updateRequest.doc(textJson, XContentType.JSON); + UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT); + int ok=updateResponse.status().getStatus(); + if (ok!=200) { + log.error("更新【"+docId+"】失败",updateResponse); + } + }else { + IndexRequest indexRequest = new IndexRequest(IndexName); + ObjectMapper mapper=new ObjectMapper(); + String textJson =mapper.writeValueAsString(dto); + indexRequest.source(textJson, XContentType.JSON); + + IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT); + if (indexResponse != null) { + String id = indexResponse.getId(); + String index = indexResponse.getIndex(); + long version = indexResponse.getVersion(); + + if (indexResponse.getResult() == DocWriteResponse.Result.CREATED) { + log.info("新增全文索引文档成功! " + index + "-" + id + "-" + version); + return id; + } else if (indexResponse.getResult() == DocWriteResponse.Result.UPDATED) { + log.info("修改文档成功!"); + return id; + } + } + } + + return docId; + + + } + + @Override + public void updateFieldByDocId(String field, Object value, String docId) throws Exception { + UpdateRequest updateRequest = new UpdateRequest(IndexName, docId); + ObjectMapper mapper=new ObjectMapper(); + Map map=new HashMap(); + map.put(field, value); + String textJson =mapper.writeValueAsString(map); + + updateRequest.doc(textJson, XContentType.JSON); + UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT); + if (updateResponse.getResult() == DocWriteResponse.Result.UPDATED) { + log.info("更新课程学习字段【"+docId+"】【"+field+"】成功!"); + } else { + log.error("更新课程学习字段【"+docId+"】【"+field+"】失败"); + } + } + + @Override + public void removeByDocId(String id) throws Exception { + + DeleteRequest deleteRequest = new DeleteRequest(IndexName); + deleteRequest.id(id); + try { + DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT); + if (deleteResponse.getResult() == DocWriteResponse.Result.NOT_FOUND) { + log.error("删除失败,未找到索引id是【"+id+"】的文档"); + } + //restHighLevelClient.close(); + } catch (IOException e) { + log.error("删除ES索引错误",e); + } + } + + @Override + public PageList search(int startRow, int pageSize, CourseStudyDto dto) throws Exception { + BoolQueryBuilder boolQuery= QueryBuilders.boolQuery(); + if(StringUtils.isNotBlank(dto.getCourseName())) { + String words=QueryParser.escape(dto.getCourseName()); + boolQuery.filter(QueryBuilders.wildcardQuery("courseName", "*"+words+"*").boost(9f)); + } + if(dto.getCourseType()!=null) { + boolQuery.filter(QueryBuilders.termQuery("courseType",dto.getCourseType())); + } + + if(dto.getStatus()!=null) { + boolQuery.filter(QueryBuilders.termQuery("status",dto.getStatus())); + } + + SearchRequest searchRequest = new SearchRequest(); + searchRequest.indices(IndexName); + + SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); + sourceBuilder.from(startRow); + sourceBuilder.size(pageSize); + + if(boolQuery.hasClauses()) { + sourceBuilder.query(boolQuery); + } + sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS)); + + searchRequest.source(sourceBuilder); + + //进行查询 + List list=new ArrayList<>(); + ObjectMapper mapper=new ObjectMapper(); + SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); + SearchHits hits = response.getHits(); + //log.info("共查询到 : "+hits.getTotalHits()); + for (SearchHit hit : hits) { + String sourceAsString = hit.getSourceAsString(); + try { + CourseStudyDto cft =mapper.readValue(sourceAsString, CourseStudyDto.class); + cft.setEsId(hit.getId()); + list.add(cft); + }catch(Exception e) { + log.error("转化json到对应失败",sourceAsString); + } + } + PageList rs=new PageList(); + rs.setCount((int)hits.getTotalHits().value); + rs.setPageSize(pageSize); + rs.setList(list); + return rs; + } + +}