es数据查询优化

This commit is contained in:
暮光:城中城
2019-07-10 22:38:36 +08:00
parent 02a56bc6b5
commit 9a50db6b5d
3 changed files with 76 additions and 19 deletions

View File

@@ -1,6 +1,7 @@
package com.zyplayer.doc.data.service.elasticsearch.support; package com.zyplayer.doc.data.service.elasticsearch.support;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.dozer.Mapper; import org.dozer.Mapper;
import org.elasticsearch.action.DocWriteResponse; import org.elasticsearch.action.DocWriteResponse;
@@ -105,6 +106,26 @@ public abstract class EsAbstractService<T> {
public EsPage<T> getDataByCondition(List<EsQueryColumn> condition, String[] fields, Integer startIndex, Integer pageSize) { public EsPage<T> getDataByCondition(List<EsQueryColumn> condition, String[] fields, Integer startIndex, Integer pageSize) {
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// 组装条件 // 组装条件
for (EsQueryColumn column : condition) {
if (StringUtils.isBlank(column.getValue())) {
if (CollectionUtils.isEmpty(column.getValues())) {
continue;
}
for (Object value : column.getValues()) {
if (column.getType() == 0) {
boolQueryBuilder.must(QueryBuilders.wildcardQuery(column.getKey(), value.toString()));
} else if (column.getType() == 1) {
boolQueryBuilder.must(QueryBuilders.termQuery(column.getKey(), value));
}
}
} else {
if (column.getType() == 0) {
boolQueryBuilder.must(QueryBuilders.wildcardQuery(column.getKey(), column.getValue()));
} else if (column.getType() == 1) {
boolQueryBuilder.must(QueryBuilders.termQuery(column.getKey(), column.getValue()));
}
}
}
condition.forEach(val -> { condition.forEach(val -> {
if (StringUtils.isNotBlank(val.getValue())) { if (StringUtils.isNotBlank(val.getValue())) {
if (val.getType() == 0) { if (val.getType() == 0) {

View File

@@ -1,5 +1,7 @@
package com.zyplayer.doc.data.service.elasticsearch.support; package com.zyplayer.doc.data.service.elasticsearch.support;
import java.util.List;
/** /**
* es查询字段封装 * es查询字段封装
* @author 暮光:城中城 * @author 暮光:城中城
@@ -8,6 +10,7 @@ package com.zyplayer.doc.data.service.elasticsearch.support;
public class EsQueryColumn { public class EsQueryColumn {
private String key; private String key;
private String value; private String value;
private List<Object> values;
// 类型0=分词搜索 1=不分词 // 类型0=分词搜索 1=不分词
private int type; private int type;
@@ -21,6 +24,12 @@ public class EsQueryColumn {
this.type = type; this.type = type;
} }
public EsQueryColumn(String key, List<Object> values, int type) {
this.key = key;
this.values = values;
this.type = type;
}
public static EsQueryColumn like(String key, String value){ public static EsQueryColumn like(String key, String value){
return new EsQueryColumn(key, value, 0); return new EsQueryColumn(key, value, 0);
} }
@@ -29,6 +38,10 @@ public class EsQueryColumn {
return new EsQueryColumn(key, value, 1); return new EsQueryColumn(key, value, 1);
} }
public static EsQueryColumn in(String key, List<Object> values){
return new EsQueryColumn(key, values, 1);
}
public String getKey() { public String getKey() {
return key; return key;
} }
@@ -52,4 +65,12 @@ public class EsQueryColumn {
public void setType(int type) { public void setType(int type) {
this.type = type; this.type = type;
} }
public List<Object> getValues() {
return values;
}
public void setValues(List<Object> values) {
this.values = values;
}
} }

View File

@@ -1,5 +1,6 @@
package com.zyplayer.doc.wiki.controller; package com.zyplayer.doc.wiki.controller;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
@@ -30,6 +31,7 @@ import org.apache.commons.lang3.StringUtils;
import org.dozer.Mapper; import org.dozer.Mapper;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
@@ -65,7 +67,7 @@ public class WikiPageController {
WikiPageMapper wikiPageMapper; WikiPageMapper wikiPageMapper;
@Resource @Resource
Mapper mapper; Mapper mapper;
@Resource @Autowired(required = false)
EsWikiPageService esWikiPageService; EsWikiPageService esWikiPageService;
@PostMapping("/list") @PostMapping("/list")
@@ -266,7 +268,8 @@ public class WikiPageController {
} }
// 保存到es // 保存到es
if (esWikiPageService != null) { if (esWikiPageService != null) {
EsWikiPage esWikiPage = mapper.map(wikiPage, EsWikiPage.class); WikiPage wikiPageSel = wikiPageService.getById(wikiPage.getId());
EsWikiPage esWikiPage = mapper.map(wikiPageSel, EsWikiPage.class);
esWikiPage.setContent(content); esWikiPage.setContent(content);
esWikiPage.setPreview(preview); esWikiPage.setPreview(preview);
esWikiPageService.create(esWikiPage); esWikiPageService.create(esWikiPage);
@@ -306,39 +309,45 @@ public class WikiPageController {
@GetMapping("/searchByEs") @GetMapping("/searchByEs")
public ResponseJson<Object> searchByEs(SearchByEsParam param) { public ResponseJson<Object> searchByEs(SearchByEsParam param) {
// 空间不是自己的 // 空间不是自己的
WikiSpace wikiSpaceSel = this.getCanVisitWikiSpace(param.getSpaceId()); Map<Long, WikiSpace> wikiSpaceSel = this.getCanVisitWikiSpace(param.getSpaceId());
if (wikiSpaceSel == null) { if (wikiSpaceSel.isEmpty()) {
return DocResponseJson.ok(); return DocResponseJson.ok();
} }
PageInfo<EsWikiPage> pageInfo = new PageInfo<>();
if (esWikiPageService != null) { if (esWikiPageService != null) {
List<EsQueryColumn> condition = new LinkedList<>(); List<EsQueryColumn> condition = new LinkedList<>();
condition.add(EsQueryColumn.like("name", param.getKeywords())); condition.add(EsQueryColumn.like("name", param.getKeywords()));
condition.add(EsQueryColumn.like("content", param.getKeywords())); condition.add(EsQueryColumn.like("content", param.getKeywords()));
// condition.add(EsQueryColumn.must("delFlag", "0")); condition.add(EsQueryColumn.must("delFlag", "0"));
condition.add(EsQueryColumn.in("spaceId", new ArrayList<>(wikiSpaceSel.keySet())));
String[] fields = { String[] fields = {
"id", "preview", "createTime", "updateTime", "createUserId", "createUserName", "id", "preview", "createTime", "updateTime", "createUserId", "createUserName",
"updateUserId", "updateUserName", "spaceId", "name", "zanNum", "viewNum", "updateUserId", "updateUserName", "spaceId", "name", "zanNum", "viewNum",
}; };
EsPage<EsWikiPage> wikiPageEsPage = esWikiPageService.getDataByCondition(condition, fields, param.getStartIndex(), param.getPageSize()); EsPage<EsWikiPage> wikiPageEsPage = esWikiPageService.getDataByCondition(condition, fields, param.getStartIndex(), param.getPageSize());
// 组装数据返回
PageInfo<EsWikiPage> pageInfo = new PageInfo<>();
pageInfo.setTotal(wikiPageEsPage.getTotal()); pageInfo.setTotal(wikiPageEsPage.getTotal());
pageInfo.setList(wikiPageEsPage.getData()); pageInfo.setList(wikiPageEsPage.getData());
return DocResponseJson.ok(pageInfo);
} else { } else {
logger.warn("未开启elasticsearch服务使用数据库查询匹配建议开启"); logger.warn("未开启elasticsearch服务使用数据库查询匹配建议开启");
SpaceNewsParam newsParam = new SpaceNewsParam();
newsParam.setPageNum(param.getPageNum());
newsParam.setPageSize(param.getPageSize());
newsParam.setSpaceId(param.getSpaceId());
return this.news(newsParam);
} }
return DocResponseJson.ok(pageInfo);
} }
@PostMapping("/news") @PostMapping("/news")
public ResponseJson<Object> news(SpaceNewsParam param) { public ResponseJson<Object> news(SpaceNewsParam param) {
// 空间不是自己的 // 空间不是自己的
WikiSpace wikiSpaceSel = this.getCanVisitWikiSpace(param.getSpaceId()); Map<Long, WikiSpace> wikiSpaceMap = this.getCanVisitWikiSpace(param.getSpaceId());
if (wikiSpaceSel == null) { if (wikiSpaceMap.isEmpty()) {
return DocResponseJson.ok(); return DocResponseJson.ok();
} }
QueryWrapper<WikiPage> wrapper = new QueryWrapper<>(); QueryWrapper<WikiPage> wrapper = new QueryWrapper<>();
wrapper.eq("space_id", param.getSpaceId()); wrapper.in("space_id", wikiSpaceMap.keySet());
wrapper.eq("del_flag", 0); wrapper.eq("del_flag", 0);
wrapper.orderByDesc(param.getNewsType() == 1, "update_time"); wrapper.orderByDesc(param.getNewsType() == 1, "update_time");
wrapper.orderByDesc(param.getNewsType() == 2, "create_time"); wrapper.orderByDesc(param.getNewsType() == 2, "create_time");
@@ -364,7 +373,7 @@ public class WikiPageController {
List<SpaceNewsVo> pageVoList = new LinkedList<>(); List<SpaceNewsVo> pageVoList = new LinkedList<>();
pageList.forEach(val -> { pageList.forEach(val -> {
SpaceNewsVo spaceNewsVo = mapper.map(val, SpaceNewsVo.class); SpaceNewsVo spaceNewsVo = mapper.map(val, SpaceNewsVo.class);
spaceNewsVo.setSpaceName(wikiSpaceSel.getName()); spaceNewsVo.setSpaceName(wikiSpaceMap.get(val.getSpaceId()).getName());
spaceNewsVo.setPreviewContent(contentMap.get(val.getId())); spaceNewsVo.setPreviewContent(contentMap.get(val.getId()));
spaceNewsVo.setPageTitle(val.getName()); spaceNewsVo.setPageTitle(val.getName());
spaceNewsVo.setPageId(val.getId()); spaceNewsVo.setPageId(val.getId());
@@ -375,17 +384,23 @@ public class WikiPageController {
return responseJson; return responseJson;
} }
private WikiSpace getCanVisitWikiSpace(Long spaceId){ private Map<Long, WikiSpace> getCanVisitWikiSpace(Long spaceId) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser(); DocUserDetails currentUser = DocUserUtil.getCurrentUser();
List<WikiSpace> spaceList;
// 空间不是自己的 // 空间不是自己的
if (spaceId == null || spaceId <= 0) { if (spaceId == null || spaceId <= 0) {
return null; QueryWrapper<WikiSpace> queryWrapper = new QueryWrapper<>();
} queryWrapper.eq("del_flag", 0);
queryWrapper.ne("type", SpaceType.privateSpace);
spaceList = wikiSpaceService.list(queryWrapper);
} else {
WikiSpace wikiSpaceSel = wikiSpaceService.getById(spaceId); WikiSpace wikiSpaceSel = wikiSpaceService.getById(spaceId);
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) { if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return null; return Collections.emptyMap();
} }
return wikiSpaceSel; spaceList = Collections.singletonList(wikiSpaceSel);
}
return spaceList.stream().collect(Collectors.toMap(WikiSpace::getId, val -> val));
} }
private void setChildren(Map<Long, List<WikiPageVo>> listMap, List<WikiPageVo> nodePageList, String path) { private void setChildren(Map<Long, List<WikiPageVo>> listMap, List<WikiPageVo> nodePageList, String path) {