es搜索优化
This commit is contained in:
@@ -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);
|
||||||
// 查询指定字段
|
// 查询指定字段
|
||||||
|
|||||||
@@ -23,11 +23,11 @@ zyplayer:
|
|||||||
# ------zyplayer_doc_manage相关配置------
|
# ------zyplayer_doc_manage相关配置------
|
||||||
manage:
|
manage:
|
||||||
elasticsearch:
|
elasticsearch:
|
||||||
# 是否开启es,true或false,现在主要用在wiki文档的搜索
|
# 是否开启es,true或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
|
||||||
|
|||||||
@@ -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 '预览内容';
|
||||||
|
|
||||||
-- ------------------------全新的库:------------------------
|
-- ------------------------全新的库:------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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;}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
File diff suppressed because one or more lines are too long
@@ -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
@@ -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>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user