From 02a56bc6b5284abfa2093b21e5958531dad2fc9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9A=AE=E5=85=89=EF=BC=9A=E5=9F=8E=E4=B8=AD=E5=9F=8E?= <806783409@qq.com> Date: Wed, 10 Jul 2019 21:19:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0elasticsearch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 1 + zyplayer-doc-data/pom.xml | 40 ++- .../elasticsearch/service/EsWikiPage.java | 246 ++++++++++++++++++ .../service/EsWikiPageService.java | 26 ++ .../elasticsearch/support/Document.java | 22 ++ .../support/ElaticSearchConfig.java | 41 +++ .../support/EsAbstractService.java | 161 ++++++++++++ .../service/elasticsearch/support/EsPage.java | 29 +++ .../elasticsearch/support/EsQueryColumn.java | 55 ++++ .../GeneratorDbDatasourceController.java | 20 -- zyplayer-doc-db/pom.xml | 3 +- zyplayer-doc-dubbo/pom.xml | 17 +- zyplayer-doc-grpc/pom.xml | 17 +- zyplayer-doc-manage/pom.xml | 4 +- .../src/main/resources/application.yml | 6 + zyplayer-doc-swagger/pom.xml | 9 +- zyplayer-doc-wiki/pom.xml | 15 +- .../wiki/controller/WikiPageController.java | 68 ++++- .../controller/param/SearchByEsParam.java | 44 ++++ 19 files changed, 761 insertions(+), 63 deletions(-) create mode 100644 zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/service/EsWikiPage.java create mode 100644 zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/service/EsWikiPageService.java create mode 100644 zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/support/Document.java create mode 100644 zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/support/ElaticSearchConfig.java create mode 100644 zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/support/EsAbstractService.java create mode 100644 zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/support/EsPage.java create mode 100644 zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/support/EsQueryColumn.java delete mode 100644 zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/web/generator/GeneratorDbDatasourceController.java create mode 100644 zyplayer-doc-wiki/src/main/java/com/zyplayer/doc/wiki/controller/param/SearchByEsParam.java diff --git a/pom.xml b/pom.xml index 79430372..3bc3cef2 100644 --- a/pom.xml +++ b/pom.xml @@ -15,6 +15,7 @@ UTF-8 1.8 1.2.53 + 6.8.0 diff --git a/zyplayer-doc-data/pom.xml b/zyplayer-doc-data/pom.xml index 6da1a83f..f2f029ce 100644 --- a/zyplayer-doc-data/pom.xml +++ b/zyplayer-doc-data/pom.xml @@ -3,17 +3,17 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - + com.zyplayer zyplayer-doc-data 1.0.2 - + org.springframework.boot spring-boot-starter-parent - 2.0.6.RELEASE + 2.1.6.RELEASE - + UTF-8 UTF-8 @@ -24,8 +24,9 @@ 6.1.0 1.1.9 1.0.2 + 6.8.0 - + org.springframework.boot @@ -47,6 +48,7 @@ mysql mysql-connector-java + 5.1.47 com.baomidou @@ -101,7 +103,33 @@ org.aspectj aspectjtools + + + org.elasticsearch + elasticsearch + ${elasticsearch.version} + + + org.elasticsearch.client + elasticsearch-rest-client + ${elasticsearch.version} + + + org.elasticsearch.client + transport + ${elasticsearch.version} + + + org.elasticsearch.plugin + transport-netty4-client + ${elasticsearch.version} + + + org.elasticsearch.plugin + reindex-client + ${elasticsearch.version} + - + diff --git a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/service/EsWikiPage.java b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/service/EsWikiPage.java new file mode 100644 index 00000000..0e475514 --- /dev/null +++ b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/service/EsWikiPage.java @@ -0,0 +1,246 @@ +package com.zyplayer.doc.data.service.elasticsearch.service; + +import com.zyplayer.doc.data.service.elasticsearch.support.Document; + +import java.util.Date; + +/** + * wiki文档搜索 + * + * @author 暮光:城中城 + * @since 2019-07-07 + */ +@Document(indexName = "zyplayer_doc", indexType = "doc_wiki") +public class EsWikiPage { + + private Long id; + + /** + * 空间ID + */ + private Long spaceId; + + /** + * 名字 + */ + private String name; + + /** + * 父ID + */ + private Long parentId; + + /** + * 节点类型 0=有子节点 1=终节点 + */ + private Integer nodeType; + + /** + * 赞的数量 + */ + private Integer zanNum; + + /** + * 编辑类型 0=可编辑 1=不允许编辑 + */ + private Integer editType; + + /** + * 创建人ID + */ + private Long createUserId; + + /** + * 创建人名字 + */ + private String createUserName; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 修改人ID + */ + private Long updateUserId; + + /** + * 修改人名字 + */ + private String updateUserName; + + /** + * 修改时间 + */ + private Date updateTime; + + /** + * 0=有效 1=删除 + */ + private Integer delFlag; + + /** + * 阅读数 + */ + private Integer viewNum; + + /** + * 顺序 + */ + private Integer seqNo; + + /** + * 内容 + */ + private String content; + + /** + * 预览内容 + */ + private String preview; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSpaceId() { + return spaceId; + } + + public void setSpaceId(Long spaceId) { + this.spaceId = spaceId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public Integer getNodeType() { + return nodeType; + } + + public void setNodeType(Integer nodeType) { + this.nodeType = nodeType; + } + + public Integer getZanNum() { + return zanNum; + } + + public void setZanNum(Integer zanNum) { + this.zanNum = zanNum; + } + + public Integer getEditType() { + return editType; + } + + public void setEditType(Integer editType) { + this.editType = editType; + } + + public Long getCreateUserId() { + return createUserId; + } + + public void setCreateUserId(Long createUserId) { + this.createUserId = createUserId; + } + + public String getCreateUserName() { + return createUserName; + } + + public void setCreateUserName(String createUserName) { + this.createUserName = createUserName; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Long getUpdateUserId() { + return updateUserId; + } + + public void setUpdateUserId(Long updateUserId) { + this.updateUserId = updateUserId; + } + + public String getUpdateUserName() { + return updateUserName; + } + + public void setUpdateUserName(String updateUserName) { + this.updateUserName = updateUserName; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Integer getDelFlag() { + return delFlag; + } + + public void setDelFlag(Integer delFlag) { + this.delFlag = delFlag; + } + + public Integer getViewNum() { + return viewNum; + } + + public void setViewNum(Integer viewNum) { + this.viewNum = viewNum; + } + + public Integer getSeqNo() { + return seqNo; + } + + public void setSeqNo(Integer seqNo) { + this.seqNo = seqNo; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getPreview() { + return preview; + } + + public void setPreview(String preview) { + this.preview = preview; + } +} diff --git a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/service/EsWikiPageService.java b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/service/EsWikiPageService.java new file mode 100644 index 00000000..9bc37cec --- /dev/null +++ b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/service/EsWikiPageService.java @@ -0,0 +1,26 @@ +package com.zyplayer.doc.data.service.elasticsearch.service; + +import com.zyplayer.doc.data.service.elasticsearch.support.ElaticSearchConfig; +import com.zyplayer.doc.data.service.elasticsearch.support.EsAbstractService; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.stereotype.Service; + +/** + * wiki文档搜索 + * @author 暮光:城中城 + * @since 2019-07-07 + */ +@Service +@ConditionalOnBean(ElaticSearchConfig.class) +public class EsWikiPageService extends EsAbstractService { + + @Override + public Class getObjClass() { + return EsWikiPage.class; + } + + @Override + public String getPrimaryKey(EsWikiPage tableIndex) { + return String.valueOf(tableIndex.getId()); + } +} diff --git a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/support/Document.java b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/support/Document.java new file mode 100644 index 00000000..1e2e2e2d --- /dev/null +++ b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/support/Document.java @@ -0,0 +1,22 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package com.zyplayer.doc.data.service.elasticsearch.support; + +import java.lang.annotation.*; + +/** + * es文档定义 + * @author 暮光:城中城 + * @since 2019-07-07 + */ +@Inherited +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE}) +public @interface Document { + String indexName(); + + String indexType(); +} diff --git a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/support/ElaticSearchConfig.java b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/support/ElaticSearchConfig.java new file mode 100644 index 00000000..d47434a0 --- /dev/null +++ b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/support/ElaticSearchConfig.java @@ -0,0 +1,41 @@ +package com.zyplayer.doc.data.service.elasticsearch.support; + +import org.elasticsearch.client.transport.TransportClient; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.transport.TransportAddress; +import org.elasticsearch.transport.client.PreBuiltTransportClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +/** + * 开启es客户端 + * + * @author 暮光:城中城 + * @since 2019-07-07 + */ +@Configuration +@ConditionalOnProperty(prefix = "zyplayer.doc.manage.elasticsearch", name = "open", havingValue = "true") +public class ElaticSearchConfig { + + @Value(value = "${zyplayer.doc.manage.elasticsearch.host:''}") + private String host; + @Value("${zyplayer.doc.manage.elasticsearch.port:''}") + private String port; + @Value("${zyplayer.doc.manage.elasticsearch.cluster-name:''}") + private String clusterName; + + @Bean + public TransportClient esClient() throws UnknownHostException { + Settings settings = Settings.builder() + .put("cluster.name", clusterName) + .put("client.transport.sniff", true) + .build(); + TransportAddress master = new TransportAddress(InetAddress.getByName(host), Integer.valueOf(port)); + return new PreBuiltTransportClient(settings).addTransportAddress(master); + } +} diff --git a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/support/EsAbstractService.java b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/support/EsAbstractService.java new file mode 100644 index 00000000..b3317c1b --- /dev/null +++ b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/support/EsAbstractService.java @@ -0,0 +1,161 @@ +package com.zyplayer.doc.data.service.elasticsearch.support; + +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; +import org.dozer.Mapper; +import org.elasticsearch.action.DocWriteResponse; +import org.elasticsearch.action.delete.DeleteResponse; +import org.elasticsearch.action.index.IndexResponse; +import org.elasticsearch.action.search.SearchRequestBuilder; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.update.UpdateResponse; +import org.elasticsearch.client.transport.TransportClient; +import org.elasticsearch.common.text.Text; +import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.rest.RestStatus; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; +import org.elasticsearch.search.fetch.subphase.highlight.HighlightField; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + * es抽象类 + * @author 暮光:城中城 + * @since 2019-07-07 + */ +public abstract class EsAbstractService { + private static final Logger logger = LoggerFactory.getLogger(EsAbstractService.class); + + @Resource + private TransportClient esClient; + @Resource + private Mapper mapper; + + public abstract Class getObjClass(); + + public abstract String getPrimaryKey(T table); + + private String getIndexName() { + Document annotation = this.getObjClass().getAnnotation(Document.class); + return annotation.indexName(); + } + + private String getIndexType() { + Document annotation = this.getObjClass().getAnnotation(Document.class); + return annotation.indexType(); + } + + public boolean create(T table) { + String pk = getPrimaryKey(table); + IndexResponse indexResponse = this.esClient + .prepareIndex(this.getIndexName(), this.getIndexType()) + .setId(pk) + .setSource(JSONObject.toJSONString(table), XContentType.JSON) + .get(); + logger.debug("ElasticSearch create index with table, pk: {}", pk); + return indexResponse.status() == RestStatus.CREATED; + } + + public boolean update(T table) { + String pk = getPrimaryKey(table); + UpdateResponse updateResponse = this.esClient + .prepareUpdate(this.getIndexName(), this.getIndexType(), pk) + .setDoc(JSONObject.toJSONString(table), XContentType.JSON) + .get(); + logger.info("ElasticSearch update index with table, pk: {}", pk); + return updateResponse.status() == RestStatus.OK; + } + + public void delete(T table) { + String pk = getPrimaryKey(table); + DeleteResponse response = this.esClient + .prepareDelete(this.getIndexName(), this.getIndexType(), pk) + .execute() + .actionGet(); + if (response.getResult() == DocWriteResponse.Result.NOT_FOUND) { + logger.warn("ElasticSearch delete index id: {} but not found!", pk); + } else { + logger.warn("ElasticSearch delete index id: {}", pk); + } + } + + /** + * 多条件 模糊查询,查询前100条 + * @param condition 查询条件 + */ + public List getDataByCondition(List condition) { + return getDataByCondition(condition, null, 0, 100).getData(); + } + + /** + * 多条件 模糊查询 + * @param condition 查询条件 + * @param startIndex 开始行 + * @param pageSize 每页数量 + */ + public EsPage getDataByCondition(List condition, String[] fields, Integer startIndex, Integer pageSize) { + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + // 组装条件 + condition.forEach(val -> { + if (StringUtils.isNotBlank(val.getValue())) { + if (val.getType() == 0) { + boolQueryBuilder.must(QueryBuilders.wildcardQuery(val.getKey(), val.getValue())); + } else if (val.getType() == 1) { + boolQueryBuilder.must(QueryBuilders.termQuery(val.getKey(), val.getValue())); + } + } + }); + // 设置高亮标签 + HighlightBuilder highlightBuilder = new HighlightBuilder(); + highlightBuilder.preTags(""); + highlightBuilder.postTags(""); + highlightBuilder.field("*"); + SearchRequestBuilder requestBuilder = esClient.prepareSearch(this.getIndexName()).setTypes(this.getIndexType()) + .setQuery(boolQueryBuilder) + .highlighter(highlightBuilder) + .setFrom(startIndex).setSize(pageSize).setExplain(true); + // 查询指定字段 + if (fields != null && fields.length > 0) { + requestBuilder.setFetchSource(fields, new String[]{}); + } + SearchResponse response = requestBuilder.execute().actionGet(); + return responseToList(response); + } + + public EsPage responseToList(SearchResponse response) { + List tableList = new LinkedList<>(); + for (SearchHit searchHit : response.getHits().getHits()) { + // 获取表ID和表类型 + Map sourceMap = searchHit.getSourceAsMap(); + if (sourceMap == null) { + sourceMap = new HashMap<>(); + } + // 获取高亮文本 + Map highlightFieldMap = searchHit.getHighlightFields(); + for (String key : highlightFieldMap.keySet()) { + HighlightField hf = highlightFieldMap.get(key); + StringBuilder fragments = new StringBuilder(); + for (Text text : hf.getFragments()) { + fragments.append(text.toString()); + } + sourceMap.put(key, fragments.toString()); + } + T table = mapper.map(sourceMap, this.getObjClass()); + tableList.add(table); + } + EsPage esPage = new EsPage<>(); + esPage.setTotal(response.getHits().getTotalHits()); + esPage.setData(tableList); + return esPage; + } + +} diff --git a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/support/EsPage.java b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/support/EsPage.java new file mode 100644 index 00000000..993bd243 --- /dev/null +++ b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/support/EsPage.java @@ -0,0 +1,29 @@ +package com.zyplayer.doc.data.service.elasticsearch.support; + +import java.util.List; + +/** + * es分页结果 + * @author 暮光:城中城 + * @since 2019-07-07 + */ +public class EsPage { + private Long total; + private List data; + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } +} diff --git a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/support/EsQueryColumn.java b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/support/EsQueryColumn.java new file mode 100644 index 00000000..b9b8c141 --- /dev/null +++ b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/elasticsearch/support/EsQueryColumn.java @@ -0,0 +1,55 @@ +package com.zyplayer.doc.data.service.elasticsearch.support; + +/** + * es查询字段封装 + * @author 暮光:城中城 + * @since 2019-07-07 + */ +public class EsQueryColumn { + private String key; + private String value; + // 类型,0=分词搜索 1=不分词 + private int type; + + public EsQueryColumn(String key, String value) { + this(key, value, 0); + } + + public EsQueryColumn(String key, String value, int type) { + this.key = key; + this.value = value; + this.type = type; + } + + public static EsQueryColumn like(String key, String value){ + return new EsQueryColumn(key, value, 0); + } + + public static EsQueryColumn must(String key, String value){ + return new EsQueryColumn(key, value, 1); + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } +} diff --git a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/web/generator/GeneratorDbDatasourceController.java b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/web/generator/GeneratorDbDatasourceController.java deleted file mode 100644 index e79d53c8..00000000 --- a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/web/generator/GeneratorDbDatasourceController.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.zyplayer.doc.data.web.generator; - - -import org.springframework.web.bind.annotation.RequestMapping; - -import org.springframework.web.bind.annotation.RestController; - -/** - *

- * 前端控制器 - *

- * - * @author 暮光:城中城 - * @since 2019-07-04 - */ -@RestController -@RequestMapping("/db-datasource") -public class GeneratorDbDatasourceController { - -} diff --git a/zyplayer-doc-db/pom.xml b/zyplayer-doc-db/pom.xml index 7ccbb0b4..6273b7ac 100644 --- a/zyplayer-doc-db/pom.xml +++ b/zyplayer-doc-db/pom.xml @@ -25,7 +25,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 2.1.6.RELEASE @@ -90,6 +90,7 @@ 1.0.2 true + 6.8.0 ${project.build.outputDirectory}/META-INF/resources/webjars/${project.artifactId}/${project.version} diff --git a/zyplayer-doc-dubbo/pom.xml b/zyplayer-doc-dubbo/pom.xml index d6af0c55..965faff8 100644 --- a/zyplayer-doc-dubbo/pom.xml +++ b/zyplayer-doc-dubbo/pom.xml @@ -8,7 +8,7 @@ 1.0.2 jar zyplayer-doc-dubbo - + dubbo文档工具 https://gitee.com/zyplayer/zyplayer-doc/zyplayer-doc-dubbo @@ -22,23 +22,24 @@ 2018-05-22 16:06:06 - + org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 2.1.6.RELEASE - + UTF-8 UTF-8 1.8 true + 6.8.0 ${project.build.outputDirectory}/META-INF/resources/webjars/${project.artifactId}/${project.version} 1.0.2 - + org.springframework.boot @@ -76,7 +77,7 @@ - + The Apache Software License, Version 2.0 @@ -88,7 +89,7 @@ scm:git@git.oschina.net:zyplayer/zyplayer-doc.git git@git.oschina.net:zyplayer/zyplayer-doc.git - + snapshots @@ -99,7 +100,7 @@ https://oss.sonatype.org/service/local/staging/deploy/maven2/ - + diff --git a/zyplayer-doc-grpc/pom.xml b/zyplayer-doc-grpc/pom.xml index 5527d480..5a872023 100644 --- a/zyplayer-doc-grpc/pom.xml +++ b/zyplayer-doc-grpc/pom.xml @@ -7,23 +7,24 @@ com.zyplayer zyplayer-doc-grpc 1.0.2 - + org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 2.1.6.RELEASE - + UTF-8 UTF-8 1.8 - + + 6.8.0 1.16.1 3.6.1 0.0.3 - + org.springframework.boot @@ -55,7 +56,7 @@ 1.0.2 - + The Apache Software License, Version 2.0 @@ -67,7 +68,7 @@ scm:git@git.oschina.net:zyplayer/zyplayer-doc.git git@git.oschina.net:zyplayer/zyplayer-doc.git - + snapshots @@ -78,7 +79,7 @@ https://oss.sonatype.org/service/local/staging/deploy/maven2/ - + diff --git a/zyplayer-doc-manage/pom.xml b/zyplayer-doc-manage/pom.xml index deeb0f84..e8bf71d6 100644 --- a/zyplayer-doc-manage/pom.xml +++ b/zyplayer-doc-manage/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.6.RELEASE + 2.1.6.RELEASE @@ -29,6 +29,7 @@ 1.9.4 2.9.2 1.0.2 + 6.8.0 @@ -52,6 +53,7 @@ mysql mysql-connector-java + 5.1.47 com.alibaba diff --git a/zyplayer-doc-manage/src/main/resources/application.yml b/zyplayer-doc-manage/src/main/resources/application.yml index 8e259e63..6d089e83 100644 --- a/zyplayer-doc-manage/src/main/resources/application.yml +++ b/zyplayer-doc-manage/src/main/resources/application.yml @@ -22,6 +22,12 @@ zyplayer: doc: # ------zyplayer_doc_manage相关配置------ manage: + elasticsearch: + # 是否开启es,true或false,现在主要用在wiki文档的搜索 + open: false + cluster-name: zyplayer-doc + port: 9300 + host: 127.0.0.1 # 版本和升级信息获取地址 version: 1.0.2 upgradePropertiesUrl: https://gitee.com/zyplayer/zyplayer-doc/raw/master/upgrade.properties diff --git a/zyplayer-doc-swagger/pom.xml b/zyplayer-doc-swagger/pom.xml index 2ad9798c..80fe7832 100644 --- a/zyplayer-doc-swagger/pom.xml +++ b/zyplayer-doc-swagger/pom.xml @@ -22,19 +22,20 @@ 2018-05-22 16:06:06 - + org.springframework.boot spring-boot-starter-parent - 1.4.2.RELEASE + 2.1.6.RELEASE - + UTF-8 UTF-8 1.8 true + 6.8.0 ${project.build.outputDirectory}/META-INF/resources/webjars/${project.artifactId}/${project.version} 1.0.2 @@ -75,7 +76,7 @@ 1.3.3 - + The Apache Software License, Version 2.0 diff --git a/zyplayer-doc-wiki/pom.xml b/zyplayer-doc-wiki/pom.xml index e41d5ab9..9a10a807 100644 --- a/zyplayer-doc-wiki/pom.xml +++ b/zyplayer-doc-wiki/pom.xml @@ -2,7 +2,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - + com.zyplayer zyplayer-doc-wiki 1.0.2 @@ -21,13 +21,13 @@ 2018-05-22 16:06:06 - + org.springframework.boot spring-boot-starter-parent - 2.0.6.RELEASE + 2.1.6.RELEASE - + UTF-8 UTF-8 @@ -35,9 +35,10 @@ 1.0.2 true + 6.8.0 ${project.build.outputDirectory}/META-INF/resources/webjars/${project.artifactId}/${project.version} - + org.springframework.boot @@ -74,7 +75,7 @@ scm:git@git.oschina.net:zyplayer/zyplayer-doc.git git@git.oschina.net:zyplayer/zyplayer-doc.git - + snapshots @@ -85,7 +86,7 @@ https://oss.sonatype.org/service/local/staging/deploy/maven2/ - + diff --git a/zyplayer-doc-wiki/src/main/java/com/zyplayer/doc/wiki/controller/WikiPageController.java b/zyplayer-doc-wiki/src/main/java/com/zyplayer/doc/wiki/controller/WikiPageController.java index ed476443..460d1fc4 100644 --- a/zyplayer-doc-wiki/src/main/java/com/zyplayer/doc/wiki/controller/WikiPageController.java +++ b/zyplayer-doc-wiki/src/main/java/com/zyplayer/doc/wiki/controller/WikiPageController.java @@ -11,8 +11,13 @@ import com.zyplayer.doc.data.config.security.DocUserDetails; import com.zyplayer.doc.data.config.security.DocUserUtil; import com.zyplayer.doc.data.repository.manage.entity.*; import com.zyplayer.doc.data.repository.manage.mapper.WikiPageMapper; +import com.zyplayer.doc.data.service.elasticsearch.service.EsWikiPage; +import com.zyplayer.doc.data.service.elasticsearch.service.EsWikiPageService; +import com.zyplayer.doc.data.service.elasticsearch.support.EsPage; +import com.zyplayer.doc.data.service.elasticsearch.support.EsQueryColumn; import com.zyplayer.doc.data.service.manage.*; import com.zyplayer.doc.data.utils.CacheUtil; +import com.zyplayer.doc.wiki.controller.param.SearchByEsParam; import com.zyplayer.doc.wiki.controller.param.SpaceNewsParam; import com.zyplayer.doc.wiki.controller.vo.SpaceNewsVo; import com.zyplayer.doc.wiki.controller.vo.WikiPageContentVo; @@ -25,6 +30,7 @@ import org.apache.commons.lang3.StringUtils; import org.dozer.Mapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -59,6 +65,8 @@ public class WikiPageController { WikiPageMapper wikiPageMapper; @Resource Mapper mapper; + @Resource + EsWikiPageService esWikiPageService; @PostMapping("/list") public ResponseJson> list(WikiPage wikiPage) { @@ -256,6 +264,15 @@ public class WikiPageController { pageContent.setCreateUserName(currentUser.getUsername()); wikiPageContentService.save(pageContent); } + // 保存到es + if (esWikiPageService != null) { + EsWikiPage esWikiPage = mapper.map(wikiPage, EsWikiPage.class); + esWikiPage.setContent(content); + esWikiPage.setPreview(preview); + esWikiPageService.create(esWikiPage); + } else { + logger.warn("未开启elasticsearch服务,建议开启"); + } return DocResponseJson.ok(wikiPage); } @@ -286,20 +303,42 @@ public class WikiPageController { return DocResponseJson.ok(); } - @PostMapping("/news") - public ResponseJson news(SpaceNewsParam param) { - DocUserDetails currentUser = DocUserUtil.getCurrentUser(); + @GetMapping("/searchByEs") + public ResponseJson searchByEs(SearchByEsParam param) { // 空间不是自己的 - Long spaceId = param.getSpaceId(); - if (spaceId == null || spaceId <= 0) { + WikiSpace wikiSpaceSel = this.getCanVisitWikiSpace(param.getSpaceId()); + if (wikiSpaceSel == null) { return DocResponseJson.ok(); } - WikiSpace wikiSpaceSel = wikiSpaceService.getById(spaceId); - if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) { + PageInfo pageInfo = new PageInfo<>(); + if (esWikiPageService != null) { + List condition = new LinkedList<>(); + condition.add(EsQueryColumn.like("name", param.getKeywords())); + condition.add(EsQueryColumn.like("content", param.getKeywords())); +// condition.add(EsQueryColumn.must("delFlag", "0")); + String[] fields = { + "id", "preview", "createTime", "updateTime", "createUserId", "createUserName", + "updateUserId", "updateUserName", "spaceId", "name", "zanNum", "viewNum", + }; + EsPage wikiPageEsPage = esWikiPageService.getDataByCondition(condition, fields, param.getStartIndex(), param.getPageSize()); + pageInfo.setTotal(wikiPageEsPage.getTotal()); + pageInfo.setList(wikiPageEsPage.getData()); + } else { + logger.warn("未开启elasticsearch服务,使用数据库查询匹配,建议开启"); + + } + return DocResponseJson.ok(pageInfo); + } + + @PostMapping("/news") + public ResponseJson news(SpaceNewsParam param) { + // 空间不是自己的 + WikiSpace wikiSpaceSel = this.getCanVisitWikiSpace(param.getSpaceId()); + if (wikiSpaceSel == null) { return DocResponseJson.ok(); } QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("space_id", spaceId); + wrapper.eq("space_id", param.getSpaceId()); wrapper.eq("del_flag", 0); wrapper.orderByDesc(param.getNewsType() == 1, "update_time"); wrapper.orderByDesc(param.getNewsType() == 2, "create_time"); @@ -336,6 +375,19 @@ public class WikiPageController { return responseJson; } + private WikiSpace getCanVisitWikiSpace(Long spaceId){ + DocUserDetails currentUser = DocUserUtil.getCurrentUser(); + // 空间不是自己的 + if (spaceId == null || spaceId <= 0) { + return null; + } + WikiSpace wikiSpaceSel = wikiSpaceService.getById(spaceId); + if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) { + return null; + } + return wikiSpaceSel; + } + private void setChildren(Map> listMap, List nodePageList, String path) { if (nodePageList == null || listMap == null) { return; diff --git a/zyplayer-doc-wiki/src/main/java/com/zyplayer/doc/wiki/controller/param/SearchByEsParam.java b/zyplayer-doc-wiki/src/main/java/com/zyplayer/doc/wiki/controller/param/SearchByEsParam.java new file mode 100644 index 00000000..fc614f85 --- /dev/null +++ b/zyplayer-doc-wiki/src/main/java/com/zyplayer/doc/wiki/controller/param/SearchByEsParam.java @@ -0,0 +1,44 @@ +package com.zyplayer.doc.wiki.controller.param; + +public class SearchByEsParam { + private Long spaceId; + private String keywords; + private Integer pageNum; + private Integer pageSize; + + public Integer getPageNum() { + return pageNum; + } + + public void setPageNum(Integer pageNum) { + this.pageNum = pageNum; + } + + public Integer getPageSize() { + return pageSize; + } + + public Integer getStartIndex() { + return (pageNum - 1) * pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public Long getSpaceId() { + return spaceId; + } + + public void setSpaceId(Long spaceId) { + this.spaceId = spaceId; + } + + public String getKeywords() { + return keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } +}