es搜索优化

This commit is contained in:
暮光:城中城
2019-07-12 21:46:05 +08:00
parent 7aa1108270
commit f03c8a03ac
12 changed files with 76 additions and 39 deletions

View File

@@ -14,6 +14,7 @@ import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.text.Text; import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.rest.RestStatus; import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHit;
@@ -135,13 +136,22 @@ public abstract class EsAbstractService<T> {
} }
} }
}); });
return this.getDataByQuery(boolQueryBuilder, fields, startIndex, pageSize);
}
/**
* 多条件 模糊查询
* @param queryBuilders 查询条件
* @param startIndex 开始行
* @param pageSize 每页数量
*/
public EsPage<T> getDataByQuery(QueryBuilder queryBuilders, String[] fields, Integer startIndex, Integer pageSize) {
// 设置高亮标签 // 设置高亮标签
HighlightBuilder highlightBuilder = new HighlightBuilder(); HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<span style=\"color:red\">"); highlightBuilder.preTags("<span style=\"color:red\">");
highlightBuilder.postTags("</span>"); highlightBuilder.postTags("</span>");
highlightBuilder.field("*"); highlightBuilder.field("*");
SearchRequestBuilder requestBuilder = esClient.prepareSearch(this.getIndexName()).setTypes(this.getIndexType()) SearchRequestBuilder requestBuilder = esClient.prepareSearch(this.getIndexName()).setTypes(this.getIndexType())
.setQuery(boolQueryBuilder) .setQuery(queryBuilders)
.highlighter(highlightBuilder) .highlighter(highlightBuilder)
.setFrom(startIndex).setSize(pageSize).setExplain(true); .setFrom(startIndex).setSize(pageSize).setExplain(true);
// 查询指定字段 // 查询指定字段

View File

@@ -23,11 +23,11 @@ zyplayer:
# ------zyplayer_doc_manage相关配置------ # ------zyplayer_doc_manage相关配置------
manage: manage:
elasticsearch: elasticsearch:
# 是否开启estrue或false现在主要用在wiki文档的搜索 # 是否开启estrue或false现在主要用在wiki文档的搜索使用的es是6.8.0及以上版本
open: false open: false
cluster-name: zyplayer-doc
port: 9300
host: 127.0.0.1 host: 127.0.0.1
port: 9300
cluster-name: zyplayer-doc
# 版本和升级信息获取地址 # 版本和升级信息获取地址
version: 1.0.2 version: 1.0.2
upgradePropertiesUrl: https://gitee.com/zyplayer/zyplayer-doc/raw/master/upgrade.properties upgradePropertiesUrl: https://gitee.com/zyplayer/zyplayer-doc/raw/master/upgrade.properties

View File

@@ -26,6 +26,8 @@ insert into user_auth(`user_id`, `auth_id`, `create_uid`, `del_flag`, `creation_
select a.id, b.id, a.id, 0, now() from user_info a,auth_info b select a.id, b.id, a.id, 0, now() from user_info a,auth_info b
where a.user_no='zyplayer' and b.auth_name='DB_DATASOURCE_MANAGE'; where a.user_no='zyplayer' and b.auth_name='DB_DATASOURCE_MANAGE';
ALTER TABLE `wiki_page_content` MODIFY COLUMN `preview` varchar(16000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '预览内容';
-- ------------------------全新的库:------------------------ -- ------------------------全新的库:------------------------

View File

@@ -11,9 +11,9 @@
<div class="line-title"> <div class="line-title">
<span class="text-link">{{item.createUserName}}</span> 发布于 <span class="text-link">{{item.spaceName}}</span> <span class="text-link">{{item.createUserName}}</span> 发布于 <span class="text-link">{{item.spaceName}}</span>
</div> </div>
<div class="page-preview-box" v-on:click="showPageDetail(item)"> <div class="page-preview-box">
<div class="page-preview-title">{{item.pageTitle}}</div> <div class="page-preview-title" v-on:click="showPageDetail(item)" v-html="item.pageTitle"></div>
<div class="page-preview-content">{{item.previewContent}}</div> <div class="page-preview-content" v-html="item.previewContent"></div>
<div> <div>
<span><img src="../../assets/img/zan.png" class="zan-img"> {{item.zanNum}} </span> <span><img src="../../assets/img/zan.png" class="zan-img"> {{item.zanNum}} </span>
<span><i class="el-icon-view view-img"></i> {{item.viewNum}} </span> <span><i class="el-icon-view view-img"></i> {{item.viewNum}} </span>
@@ -110,8 +110,8 @@
} }
.line-box{color: #666;border-bottom: 1px solid #eee;padding: 20px 0;} .line-box{color: #666;border-bottom: 1px solid #eee;padding: 20px 0;}
.line-title{font-size: 14px;} .line-title{font-size: 14px;}
.page-preview-box{cursor: pointer;} .page-preview-box{}
.page-preview-title{font-size: 20px;margin: 10px 0 5px 0;color: #000;} .page-preview-title{cursor: pointer;font-size: 20px;margin: 10px 0 5px 0;color: #3a8ee6;}
.page-preview-content{font-size: 16px;margin-bottom: 5px;} .page-preview-content{font-size: 16px;margin-bottom: 5px;}
.zan-img{vertical-align: middle;margin-top: -3px;} .zan-img{vertical-align: middle;margin-top: -3px;}
.view-img{font-size: 16px;color: #666;} .view-img{font-size: 16px;color: #666;}

View File

@@ -85,9 +85,6 @@
return; return;
} }
var preview = this.editor.txt.text(); var preview = this.editor.txt.text();
if (preview.length > 200) {
preview = preview.substring(0, 200) + '...';
}
var param = { var param = {
spaceId: app.parentPath.spaceId, spaceId: app.parentPath.spaceId,
parentId: parentId, parentId: parentId,

View File

@@ -17,8 +17,8 @@
<span class="text-link">{{item.createUserName}}</span> 发布于 <span class="text-link">{{item.spaceName}}</span> <span class="text-link">{{item.createUserName}}</span> 发布于 <span class="text-link">{{item.spaceName}}</span>
</div> </div>
<div class="page-preview-box"> <div class="page-preview-box">
<div class="page-preview-title" v-on:click="showPageDetail(item)">{{item.pageTitle}}</div> <div class="page-preview-title" v-on:click="showPageDetail(item)" v-html="item.pageTitle"></div>
<div class="page-preview-content">{{item.previewContent}}</div> <div class="page-preview-content" v-html="item.previewContent"></div>
<div> <div>
<span><img src="../../assets/img/zan.png" class="zan-img"> {{item.zanNum}} </span> <span><img src="../../assets/img/zan.png" class="zan-img"> {{item.zanNum}} </span>
<span><i class="el-icon-view view-img"></i> {{item.viewNum}} </span> <span><i class="el-icon-view view-img"></i> {{item.viewNum}} </span>

View File

@@ -17,7 +17,6 @@ import com.zyplayer.doc.data.repository.manage.vo.SpaceNewsVo;
import com.zyplayer.doc.data.service.elasticsearch.service.EsWikiPage; 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.service.EsWikiPageService;
import com.zyplayer.doc.data.service.elasticsearch.support.EsPage; 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.service.manage.*;
import com.zyplayer.doc.data.utils.CacheUtil; import com.zyplayer.doc.data.utils.CacheUtil;
import com.zyplayer.doc.wiki.controller.vo.WikiPageContentVo; import com.zyplayer.doc.wiki.controller.vo.WikiPageContentVo;
@@ -28,6 +27,8 @@ import com.zyplayer.doc.wiki.framework.consts.WikiCachePrefix;
import org.apache.commons.collections.CollectionUtils; 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.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
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.beans.factory.annotation.Autowired;
@@ -207,6 +208,10 @@ public class WikiPageController {
WikiPageContent pageContent = new WikiPageContent(); WikiPageContent pageContent = new WikiPageContent();
pageContent.setContent(content); pageContent.setContent(content);
pageContent.setPreview(preview); pageContent.setPreview(preview);
// 数据库是varchar(16000)所以如果不开启es的话搜索超过16000的文章就搜不到~es存preview不截断
if (StringUtils.isNotBlank(preview) && preview.length() > 16000) {
pageContent.setPreview(preview.substring(0, 16000));
}
if (StringUtils.isBlank(wikiPage.getName())) { if (StringUtils.isBlank(wikiPage.getName())) {
return DocResponseJson.warn("标题不能为空!"); return DocResponseJson.warn("标题不能为空!");
} }
@@ -313,23 +318,28 @@ public class WikiPageController {
if (wikiSpaceMap.isEmpty()) { if (wikiSpaceMap.isEmpty()) {
return DocResponseJson.ok(); return DocResponseJson.ok();
} }
List<EsQueryColumn> condition = new LinkedList<>();
condition.add(EsQueryColumn.like("name", param.getKeywords()));
condition.add(EsQueryColumn.like("content", param.getKeywords()));
condition.add(EsQueryColumn.must("delFlag", "0"));
condition.add(EsQueryColumn.in("spaceId", new ArrayList<>(wikiSpaceMap.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()); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
if (StringUtils.isNotBlank(param.getKeywords())) {
boolQueryBuilder.must(QueryBuilders.multiMatchQuery(param.getKeywords(), "name", "preview"));
}
boolQueryBuilder.must(QueryBuilders.termQuery("delFlag", "0"));
boolQueryBuilder.must(QueryBuilders.termsQuery("spaceId", wikiSpaceMap.keySet().toArray()));
EsPage<EsWikiPage> wikiPageEsPage = esWikiPageService.getDataByQuery(boolQueryBuilder, fields, param.getStartIndex(), param.getPageSize());
// 组装数据 // 组装数据
List<EsWikiPage> esWikiPageList = wikiPageEsPage.getData(); List<EsWikiPage> esWikiPageList = wikiPageEsPage.getData();
List<SpaceNewsVo> pageVoList = new LinkedList<>(); List<SpaceNewsVo> pageVoList = new LinkedList<>();
esWikiPageList.forEach(val -> { esWikiPageList.forEach(val -> {
String preview = val.getPreview();
if (preview != null && preview.length() > 200) {
preview = preview.substring(0, 200);
}
SpaceNewsVo spaceNewsVo = mapper.map(val, SpaceNewsVo.class); SpaceNewsVo spaceNewsVo = mapper.map(val, SpaceNewsVo.class);
spaceNewsVo.setSpaceName(wikiSpaceMap.get(val.getSpaceId()).getName()); spaceNewsVo.setSpaceName(wikiSpaceMap.get(val.getSpaceId()).getName());
spaceNewsVo.setPreviewContent(val.getPreview()); spaceNewsVo.setPreviewContent(preview);
spaceNewsVo.setPageTitle(val.getName()); spaceNewsVo.setPageTitle(val.getName());
spaceNewsVo.setPageId(val.getId()); spaceNewsVo.setPageId(val.getId());
pageVoList.add(spaceNewsVo); pageVoList.add(spaceNewsVo);
@@ -354,8 +364,9 @@ public class WikiPageController {
return DocResponseJson.ok(); return DocResponseJson.ok();
} }
param.setSpaceIds(new ArrayList<>(wikiSpaceMap.keySet())); param.setSpaceIds(new ArrayList<>(wikiSpaceMap.keySet()));
if (StringUtils.isNotBlank(param.getKeywords())) { String keywords = param.getKeywords();
param.setKeywords("%" + param.getKeywords() + "%"); if (StringUtils.isNotBlank(keywords)) {
param.setKeywords("%" + keywords + "%");
} }
// 分页查询 // 分页查询
PageHelper.startPage(param.getPageNum(), param.getPageSize(), true); PageHelper.startPage(param.getPageNum(), param.getPageSize(), true);
@@ -364,7 +375,24 @@ public class WikiPageController {
if (spaceNewsVoList == null || spaceNewsVoList.isEmpty()) { if (spaceNewsVoList == null || spaceNewsVoList.isEmpty()) {
return DocResponseJson.ok(pageListPageInfo); return DocResponseJson.ok(pageListPageInfo);
} }
spaceNewsVoList.forEach(val -> val.setSpaceName(wikiSpaceMap.get(val.getSpaceId()).getName())); spaceNewsVoList.forEach(val -> {
val.setSpaceName(wikiSpaceMap.get(val.getSpaceId()).getName());
String preview = val.getPreviewContent();
if (preview != null) {
if (preview.length() > 200) {
preview = preview.substring(0, 200);
}
if (keywords != null) {
preview = preview.replace(keywords, "<span style=\"color:red\">" + keywords + "</span>");
}
}
val.setPreviewContent(preview);
String pageTitle = val.getPageTitle();
if (pageTitle != null && keywords != null) {
pageTitle = pageTitle.replace(keywords, "<span style=\"color:red\">" + keywords + "</span>");
}
val.setPageTitle(pageTitle);
});
return DocResponseJson.ok(pageListPageInfo); return DocResponseJson.ok(pageListPageInfo);
} }

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +1,2 @@
!function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var r=window.webpackJsonp;window.webpackJsonp=function(t,c,u){for(var a,i,f,l=0,s=[];l<t.length;l++)i=t[l],o[i]&&s.push(o[i][0]),o[i]=0;for(a in c)Object.prototype.hasOwnProperty.call(c,a)&&(e[a]=c[a]);for(r&&r(t,c,u);s.length;)s.shift()();if(u)for(l=0;l<u.length;l++)f=n(n.s=u[l]);return f};var t={},o={2:0};n.e=function(e){function r(){a.onerror=a.onload=null,clearTimeout(i);var n=o[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}var t=o[e];if(0===t)return new Promise(function(e){e()});if(t)return t[2];var c=new Promise(function(n,r){t=o[e]=[n,r]});t[2]=c;var u=document.getElementsByTagName("head")[0],a=document.createElement("script");a.type="text/javascript",a.charset="utf-8",a.async=!0,a.timeout=12e4,n.nc&&a.setAttribute("nonce",n.nc),a.src=n.p+""+e+".js?"+{0:"9ec105d44d5289b021f9",1:"6ab7965acbaeb916d405"}[e];var i=setTimeout(r,12e4);return a.onerror=a.onload=r,u.appendChild(a),c},n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:t})},n.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(r,"a",r),r},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n.oe=function(e){throw console.error(e),e}}([]); !function(e){function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var n=window.webpackJsonp;window.webpackJsonp=function(t,c,u){for(var i,a,f,l=0,s=[];l<t.length;l++)a=t[l],o[a]&&s.push(o[a][0]),o[a]=0;for(i in c)Object.prototype.hasOwnProperty.call(c,i)&&(e[i]=c[i]);for(n&&n(t,c,u);s.length;)s.shift()();if(u)for(l=0;l<u.length;l++)f=r(r.s=u[l]);return f};var t={},o={2:0};r.e=function(e){function n(){u.onerror=u.onload=null,clearTimeout(i);var r=o[e];0!==r&&(r&&r[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}if(0===o[e])return Promise.resolve();if(o[e])return o[e][2];var t=new Promise(function(r,n){o[e]=[r,n]});o[e][2]=t;var c=document.getElementsByTagName("head")[0],u=document.createElement("script");u.type="text/javascript",u.charset="utf-8",u.async=!0,u.timeout=12e4,r.nc&&u.setAttribute("nonce",r.nc),u.src=r.p+""+e+".js?"+{0:"2b8a785d47f4d7159c21",1:"0bbf3109e968f057361a"}[e];var i=setTimeout(n,12e4);return u.onerror=u.onload=n,c.appendChild(u),t},r.m=e,r.c=t,r.i=function(e){return e},r.d=function(e,n,t){r.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:t})},r.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(n,"a",n),n},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="",r.oe=function(e){throw console.error(e),e}}([]);
//# sourceMappingURL=doc-wiki-manifest.js.map?095c8c63120ab062a303 //# sourceMappingURL=doc-wiki-manifest.js.map?0bd521aa925078f9f41e

File diff suppressed because one or more lines are too long

View File

@@ -8,7 +8,7 @@
<body> <body>
<div id="app"></div> <div id="app"></div>
<script type="text/javascript" src="doc-wiki-manifest.js?095c8c63120ab062a303"></script><script type="text/javascript" src="doc-wiki-vendor.js?9ec105d44d5289b021f9"></script><script type="text/javascript" src="doc-wiki-index.js?6ab7965acbaeb916d405"></script></body> <script type="text/javascript" src="doc-wiki-manifest.js?0bd521aa925078f9f41e"></script><script type="text/javascript" src="doc-wiki-vendor.js?2b8a785d47f4d7159c21"></script><script type="text/javascript" src="doc-wiki-index.js?0bbf3109e968f057361a"></script></body>
</html> </html>