Commit 219f8f7f by 田超

Merge branch 'feature/ik_series_1208' into 'master'

feat:[none] 小程序书搜索改为分词搜索方式

See merge request rays/pcloud-book!1095
parents f38b989a a2225650
...@@ -20,9 +20,12 @@ import com.pcloud.common.utils.ListUtils; ...@@ -20,9 +20,12 @@ import com.pcloud.common.utils.ListUtils;
import com.pcloud.common.utils.string.StringUtil; import com.pcloud.common.utils.string.StringUtil;
import com.pcloud.facade.tradecenter.dto.BookIncomeQueryVo; import com.pcloud.facade.tradecenter.dto.BookIncomeQueryVo;
import com.pcloud.facade.tradecenter.dto.IncomeBackDto; import com.pcloud.facade.tradecenter.dto.IncomeBackDto;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils; import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.QueryBuilders;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -43,8 +46,6 @@ import java.util.Map; ...@@ -43,8 +46,6 @@ import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import lombok.extern.slf4j.Slf4j;
/** /**
* @Description * @Description
* @Author ruansiyuan * @Author ruansiyuan
...@@ -209,18 +210,20 @@ public class ESBookAndAdviserBizImpl implements ESBookAndAdviserBiz { ...@@ -209,18 +210,20 @@ public class ESBookAndAdviserBizImpl implements ESBookAndAdviserBiz {
.filter(Objects.isNull(templetId) ? QueryBuilders.boolQuery() : QueryBuilders.termQuery("templetId", templetId)) .filter(Objects.isNull(templetId) ? QueryBuilders.boolQuery() : QueryBuilders.termQuery("templetId", templetId))
.filter(Objects.isNull(secondTempletId) ? QueryBuilders.boolQuery() : QueryBuilders.termQuery("secondTempletId", secondTempletId)); .filter(Objects.isNull(secondTempletId) ? QueryBuilders.boolQuery() : QueryBuilders.termQuery("secondTempletId", secondTempletId));
BoolQueryBuilder should = QueryBuilders.boolQuery()
.should(StringUtil.isEmpty(keyword) ? QueryBuilders.boolQuery()
: QueryBuilders.wildcardQuery("bookName", IKAnalyzerUtil.aroundWildcard(IKAnalyzerUtil.parseWildcardString(keyword))))
.should(StringUtil.isEmpty(keyword) ? QueryBuilders.boolQuery()
: QueryBuilders.wildcardQuery("isbn", IKAnalyzerUtil.aroundWildcard(keyword)));
BoolQueryBuilder should1 = QueryBuilders.boolQuery() BoolQueryBuilder should1 = QueryBuilders.boolQuery()
.should(QueryBuilders.termQuery("isBookAdviserDelete", 0)) .should(QueryBuilders.termQuery("isBookAdviserDelete", 0))
.should(QueryBuilders.termQuery("isAdviserBook", 0)); .should(QueryBuilders.termQuery("isAdviserBook", 0));
// 审核通过之后屏蔽掉测试编辑的书刊 // 审核通过之后屏蔽掉测试编辑的书刊
BoolQueryBuilder adviserIdBuilder = getAdviserIdBuilder(grayStatus); BoolQueryBuilder adviserIdBuilder = getAdviserIdBuilder(grayStatus);
boolQueryBuilder.must(should);
if (isIsbn(keyword)) {
boolQueryBuilder.must(QueryBuilders.termsQuery("isbn", keyword));
} else if (StringUtils.isNotBlank(keyword)) {
MatchQueryBuilder mqb = QueryBuilders.matchQuery("ikBookName", keyword).minimumShouldMatch("75%");
boolQueryBuilder.must(mqb);
}
boolQueryBuilder.must(should1); boolQueryBuilder.must(should1);
boolQueryBuilder.must(adviserIdBuilder); boolQueryBuilder.must(adviserIdBuilder);
Sort sort=new Sort(Sort.Direction.DESC, "isAdviserBook","lastModifiedDate", "bookId"); Sort sort=new Sort(Sort.Direction.DESC, "isAdviserBook","lastModifiedDate", "bookId");
...@@ -246,34 +249,47 @@ public class ESBookAndAdviserBizImpl implements ESBookAndAdviserBiz { ...@@ -246,34 +249,47 @@ public class ESBookAndAdviserBizImpl implements ESBookAndAdviserBiz {
return adviserIdBuilder; return adviserIdBuilder;
} }
private boolean isIsbn(String keyword) {
return StringUtils.isNumeric(keyword) && StringUtils.length(keyword) > 4;
}
@Override @Override
public Page<ESBookAndAdviser> getESAdviserBooks4Applet(String grayStatus, String keyword, List<Long> templetIds, List<Long> graLabelIds, public Page<ESBookAndAdviser> getESAdviserBooks4Applet(String grayStatus, String keyword, List<Long> templetIds, List<Long> graLabelIds,
List<Long> subLabelIds, Integer currentPage, Integer numPerPage, List<Long> scecondTempletIds, Integer isAdviserBook, List<Long> adviserIds, Long agentId) { List<Long> subLabelIds, Integer currentPage, Integer numPerPage, List<Long> scecondTempletIds, Integer isAdviserBook, List<Long> adviserIds, Long agentId) {
long start = System.currentTimeMillis();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery() BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
.filter(QueryBuilders.termQuery("isBookDelete", 0)) .filter(QueryBuilders.termQuery("isBookDelete", 0))
.filter(QueryBuilders.termQuery("isBookAdviserDelete", 0)) .filter(QueryBuilders.termQuery("isBookAdviserDelete", 0));
.filter(ListUtils.isEmpty(templetIds) ? QueryBuilders.boolQuery() : QueryBuilders.termsQuery("templetId", templetIds)) if (CollectionUtils.isNotEmpty(templetIds)) {
.filter(null == agentId ? QueryBuilders.boolQuery() : QueryBuilders.termsQuery("adviserId", adviserIds)); boolQueryBuilder.filter(QueryBuilders.termsQuery("templetId", templetIds));
}
BoolQueryBuilder should = QueryBuilders.boolQuery() if (agentId != null) {
.should(StringUtil.isEmpty(keyword) ? QueryBuilders.boolQuery() boolQueryBuilder.filter(QueryBuilders.termsQuery("adviserId", adviserIds));
: QueryBuilders.wildcardQuery("bookName", IKAnalyzerUtil.aroundWildcard(IKAnalyzerUtil.parseWildcardString(keyword)))) }
.should(StringUtil.isEmpty(keyword) ? QueryBuilders.boolQuery()
: QueryBuilders.wildcardQuery("isbn", IKAnalyzerUtil.aroundWildcard(keyword)));
BoolQueryBuilder should1 = QueryBuilders.boolQuery()
.should(null == isAdviserBook ? QueryBuilders.boolQuery() : QueryBuilders.termQuery("isAdviserBook",isAdviserBook));
//(年级&&科目)||二级分类 //(年级&&科目)||二级分类
BoolQueryBuilder must1 = QueryBuilders.boolQuery() BoolQueryBuilder must1 = QueryBuilders.boolQuery()
.filter(ListUtils.isEmpty(graLabelIds) ? QueryBuilders.boolQuery() : QueryBuilders.termsQuery("graLabelId", graLabelIds)) .filter(ListUtils.isEmpty(graLabelIds) ? QueryBuilders.boolQuery() : QueryBuilders.termsQuery("graLabelId", graLabelIds))
.filter(ListUtils.isEmpty(subLabelIds) ? QueryBuilders.boolQuery() : QueryBuilders.termsQuery("subLabelId", subLabelIds)); .filter(ListUtils.isEmpty(subLabelIds) ? QueryBuilders.boolQuery() : QueryBuilders.termsQuery("subLabelId", subLabelIds));
BoolQueryBuilder must2 = QueryBuilders.boolQuery().filter(ListUtils.isEmpty(scecondTempletIds) ? QueryBuilders.boolQuery() : QueryBuilders.termsQuery("secondTempletId", scecondTempletIds)); BoolQueryBuilder must2 = QueryBuilders.boolQuery().filter(ListUtils.isEmpty(scecondTempletIds) ? QueryBuilders.boolQuery() : QueryBuilders.termsQuery("secondTempletId", scecondTempletIds));
BoolQueryBuilder should2 = QueryBuilders.boolQuery().should(must1).should(must2); BoolQueryBuilder should2 = QueryBuilders.boolQuery().should(must1).should(must2);
// 审核通过之后屏蔽掉测试编辑的书刊 // 审核通过之后屏蔽掉测试编辑的书刊
BoolQueryBuilder adviserIdBuilder = getAdviserIdBuilder(grayStatus); BoolQueryBuilder adviserIdBuilder = getAdviserIdBuilder(grayStatus);
boolQueryBuilder.must(adviserIdBuilder); boolQueryBuilder.must(adviserIdBuilder);
boolQueryBuilder.must(should);
boolQueryBuilder.must(should1); if (isIsbn(keyword)) {
boolQueryBuilder.must(QueryBuilders.termsQuery("isbn", keyword));
} else if (StringUtils.isNotBlank(keyword)) {
MatchQueryBuilder mqb = QueryBuilders.matchQuery("ikBookName", keyword).minimumShouldMatch("75%");
boolQueryBuilder.must(mqb);
}
if (isAdviserBook != null) {
boolQueryBuilder.must(QueryBuilders.termQuery("isAdviserBook",isAdviserBook));
}
if (!ListUtils.isEmpty(scecondTempletIds)) { if (!ListUtils.isEmpty(scecondTempletIds)) {
if (ListUtils.isEmpty(graLabelIds) && ListUtils.isEmpty(subLabelIds)) { if (ListUtils.isEmpty(graLabelIds) && ListUtils.isEmpty(subLabelIds)) {
boolQueryBuilder.must(must2); boolQueryBuilder.must(must2);
...@@ -283,10 +299,14 @@ public class ESBookAndAdviserBizImpl implements ESBookAndAdviserBiz { ...@@ -283,10 +299,14 @@ public class ESBookAndAdviserBizImpl implements ESBookAndAdviserBiz {
} else if (!ListUtils.isEmpty(graLabelIds) || !ListUtils.isEmpty(subLabelIds)) { } else if (!ListUtils.isEmpty(graLabelIds) || !ListUtils.isEmpty(subLabelIds)) {
boolQueryBuilder.must(must1); boolQueryBuilder.must(must1);
} }
//基金书 // 排序:因为涉及分词,故而_score固定放在第一位
Sort sort = new Sort(Sort.Direction.DESC, "isFundSupport", "fundBookValue", "resourceCount", "isAdviserBook", "lastModifiedDate", "bookId"); Sort sort = new Sort(Sort.Direction.DESC, "_score", "isFundSupport", "fundBookValue", "resourceCount", "isAdviserBook", "lastModifiedDate", "bookId");
PageRequest pageRequest = new PageRequest(currentPage, numPerPage, sort); PageRequest pageRequest = new PageRequest(currentPage, numPerPage, sort);
Page<ESBookAndAdviser> search = bookAndAdviserRepository.search(boolQueryBuilder, pageRequest); Page<ESBookAndAdviser> search = bookAndAdviserRepository.search(boolQueryBuilder, pageRequest);
log.info("es.search({})==>{},total={},cost={}",
StringUtils.replaceEach(boolQueryBuilder.toString(), new String[]{"\n", " ", " : "}, new String[]{"", "", ":"}),
search, search.getTotalElements(), (System.currentTimeMillis() - start));
return search; return search;
} }
......
...@@ -78,6 +78,12 @@ public class ESBookAndAdviser { ...@@ -78,6 +78,12 @@ public class ESBookAndAdviser {
private String bookName; private String bookName;
/** /**
* 书籍名称,同上面bookName,ES按分词存储,主要用于分词搜索
*/
@Field(type = FieldType.String, index = FieldIndex.analyzed, analyzer = "ik_max_word", searchAnalyzer = "ik_max_word")
private String ikBookName;
/**
* 是否删除(书) * 是否删除(书)
*/ */
private String isBookDelete; private String isBookDelete;
......
...@@ -105,5 +105,6 @@ ...@@ -105,5 +105,6 @@
<logger name="net.sf.ehcache" level="DEBUG"/> <logger name="net.sf.ehcache" level="DEBUG"/>
<logger name="druid.sql" level="DEBUG"/> <logger name="druid.sql" level="DEBUG"/>
<logger name="io.micrometer.influx.InfluxRegistry" level="ERROR"/>
</configuration> </configuration>
\ No newline at end of file
...@@ -2318,6 +2318,7 @@ ...@@ -2318,6 +2318,7 @@
B.BOOK_ID bookId, B.BOOK_ID bookId,
B.ISBN isbn, B.ISBN isbn,
B.BOOK_NAME bookName, B.BOOK_NAME bookName,
B.BOOK_NAME ikBookName,
B.IS_DELETE isBookDelete, B.IS_DELETE isBookDelete,
B.TYPE_CODE typeCode, B.TYPE_CODE typeCode,
IF(A.IS_DELETE is NULL, 0, A.IS_DELETE) isBookAdviserDelete, IF(A.IS_DELETE is NULL, 0, A.IS_DELETE) isBookAdviserDelete,
...@@ -2355,6 +2356,7 @@ ...@@ -2355,6 +2356,7 @@
B.BOOK_ID bookId, B.BOOK_ID bookId,
B.ISBN isbn, B.ISBN isbn,
B.BOOK_NAME bookName, B.BOOK_NAME bookName,
B.BOOK_NAME ikBookName,
B.IS_DELETE isBookDelete, B.IS_DELETE isBookDelete,
B.TYPE_CODE typeCode, B.TYPE_CODE typeCode,
IF(A.IS_DELETE is NULL, 0, A.IS_DELETE) isBookAdviserDelete, IF(A.IS_DELETE is NULL, 0, A.IS_DELETE) isBookAdviserDelete,
......
...@@ -3,8 +3,11 @@ package com.pcloud.book.test; ...@@ -3,8 +3,11 @@ package com.pcloud.book.test;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.pcloud.book.BookApplication; import com.pcloud.book.BookApplication;
import com.pcloud.book.es.biz.ESBookAndAdviserBiz; import com.pcloud.book.es.biz.ESBookAndAdviserBiz;
import com.pcloud.book.es.biz.impl.IKAnalyzerUtil;
import com.pcloud.book.es.entity.ESBookAndAdviser; import com.pcloud.book.es.entity.ESBookAndAdviser;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.StopWatch;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -22,23 +25,51 @@ public class ESBookAndAdviserBizTest { ...@@ -22,23 +25,51 @@ public class ESBookAndAdviserBizTest {
@Test @Test
public void testes() { public void testes() {
Page<ESBookAndAdviser> p = esBookAndAdviserBiz.getAdviserBooks4ES(null, "计算机互联网", StopWatch sw = new StopWatch();
null, null, 0, 50); sw.start();
String keyword = "9787566602442";
Page<ESBookAndAdviser> p = esBookAndAdviserBiz.getESAdviserBooks4Applet(null,
keyword, null, null, null,
0, 100,
null, null, null, null);
log.info("count:{}", p.getTotalElements()); log.info("key:{},count:{},cost:{},==>{}", keyword, p.getTotalElements(), sw.getTime(), StringUtils.join(IKAnalyzerUtil.analyzerText(keyword), " "));
p.forEach((baa) -> log.info(JSON.toJSONString(baa))); p.forEach((baa) -> log.info(JSON.toJSONString(baa)));
p = esBookAndAdviserBiz.getAdviserBooks4ES(null, "测试书籍", sw.reset();
null, null, 0, 50); sw.start();
keyword = "2020秋百年学典三年级";
p = esBookAndAdviserBiz.getESAdviserBooks4Applet(null,
keyword, null, null, null,
0, 100,
null, null, null, null);
log.info("count:{}", p.getTotalElements()); log.info("key:{},count:{},cost:{},==>{}", keyword, p.getTotalElements(), sw.getTime(), StringUtils.join(IKAnalyzerUtil.analyzerText(keyword), " "));
p.forEach((baa) -> log.info(JSON.toJSONString(baa))); p.forEach((baa) -> log.info(JSON.toJSONString(baa)));
p = esBookAndAdviserBiz.getAdviserBooks4ES(null, "学基础训练上册", sw.reset();
null, null, 0, 50); sw.start();
keyword = "码群书";
p = esBookAndAdviserBiz.getESAdviserBooks4Applet(null,
keyword, null, null, null,
0, 100,
null, null, null, null);
log.info("count:{}", p.getTotalElements()); log.info("key:{},count:{},cost:{},==>{}", keyword, p.getTotalElements(), sw.getTime(), StringUtils.join(IKAnalyzerUtil.analyzerText(keyword), " "));
p.forEach((baa) -> log.info(JSON.toJSONString(baa))); p.forEach((baa) -> log.info(JSON.toJSONString(baa)));
sw.reset();
sw.start();
keyword = "跟着名师学数学 单元测试卷 六年级第一学期\\n(跟着名师学数学)本书由一线名师编写,紧扣新课标的标准,在内容编排上,结合新教材的要求,设置了以下试卷类型: 阶段基础训练、阶段拓展训练、综合测试卷、期中、期末模拟试卷和参考答案";
p = esBookAndAdviserBiz.getESAdviserBooks4Applet(null,
keyword, null, null, null,
0, 100,
null, null, null, null);
log.info("key:{},count:{},cost:{},==>{}", keyword, p.getTotalElements(), sw.getTime(), StringUtils.join(IKAnalyzerUtil.analyzerText(keyword), " "));
p.forEach((baa) -> log.info(JSON.toJSONString(baa)));
sw.stop();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment