|
@@ -21,10 +21,7 @@ import lombok.extern.slf4j.Slf4j;
|
21
|
21
|
import org.apache.lucene.search.join.ScoreMode;
|
22
|
22
|
import org.elasticsearch.common.lucene.search.function.FieldValueFactorFunction;
|
23
|
23
|
import org.elasticsearch.common.lucene.search.function.FunctionScoreQuery;
|
24
|
|
-import org.elasticsearch.index.query.BoolQueryBuilder;
|
25
|
|
-import org.elasticsearch.index.query.MatchQueryBuilder;
|
26
|
|
-import org.elasticsearch.index.query.Operator;
|
27
|
|
-import org.elasticsearch.index.query.QueryBuilders;
|
|
24
|
+import org.elasticsearch.index.query.*;
|
28
|
25
|
import org.elasticsearch.index.query.functionscore.FieldValueFactorFunctionBuilder;
|
29
|
26
|
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
|
30
|
27
|
import org.elasticsearch.index.query.functionscore.GaussDecayFunctionBuilder;
|
|
@@ -93,13 +90,69 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService {
|
93
|
90
|
if (CharSequenceUtil.isNotEmpty(searchDTO.getKeyword())) {
|
94
|
91
|
cache.incrementScore(CachePrefix.HOT_WORD.getPrefix(), searchDTO.getKeyword());
|
95
|
92
|
}
|
96
|
|
- NativeSearchQueryBuilder searchQueryBuilder = createSearchQueryBuilder(searchDTO, pageVo);
|
|
93
|
+
|
|
94
|
+ NativeSearchQueryBuilder searchQueryBuilder = simpleSearch(searchDTO, pageVo);
|
97
|
95
|
NativeSearchQuery searchQuery = searchQueryBuilder.build();
|
98
|
96
|
log.info("searchGoods DSL:{}", searchQuery.getQuery());
|
99
|
97
|
SearchHits<EsGoodsIndex> search = restTemplate.search(searchQuery, EsGoodsIndex.class);
|
100
|
98
|
return SearchHitSupport.searchPageFor(search, searchQuery.getPageable());
|
101
|
99
|
}
|
102
|
100
|
|
|
101
|
+ private NativeSearchQueryBuilder simpleSearch(EsGoodsSearchDTO searchDTO, PageVO pageVo){
|
|
102
|
+ NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
|
|
103
|
+ if (pageVo != null) {
|
|
104
|
+ int pageNumber = pageVo.getPageNumber() - 1;
|
|
105
|
+ if (pageNumber < 0) {
|
|
106
|
+ pageNumber = 0;
|
|
107
|
+ }
|
|
108
|
+ Pageable pageable = PageRequest.of(pageNumber, pageVo.getPageSize());
|
|
109
|
+ //分页
|
|
110
|
+ nativeSearchQueryBuilder.withPageable(pageable);
|
|
111
|
+ }
|
|
112
|
+ //查询参数非空判定
|
|
113
|
+ if (searchDTO != null) {
|
|
114
|
+ //过滤条件
|
|
115
|
+ BoolQueryBuilder filterBuilder = QueryBuilders.boolQuery();
|
|
116
|
+
|
|
117
|
+ //对查询条件进行处理
|
|
118
|
+ this.commonSearch(filterBuilder, searchDTO);
|
|
119
|
+
|
|
120
|
+ //未上架的商品不显示
|
|
121
|
+ filterBuilder.must(QueryBuilders.matchQuery("marketEnable", GoodsStatusEnum.UPPER.name()));
|
|
122
|
+ //待审核和审核不通过的商品不显示
|
|
123
|
+ filterBuilder.must(QueryBuilders.matchQuery("authFlag", GoodsAuthEnum.PASS.name()));
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+ //关键字检索
|
|
127
|
+ if (CharSequenceUtil.isEmpty(searchDTO.getKeyword())) {
|
|
128
|
+ List<FunctionScoreQueryBuilder.FilterFunctionBuilder> filterFunctionBuilders = new ArrayList<>();
|
|
129
|
+ GaussDecayFunctionBuilder skuNoScore = ScoreFunctionBuilders.gaussDecayFunction("skuSource", 100, 10).setWeight(10);
|
|
130
|
+ FunctionScoreQueryBuilder.FilterFunctionBuilder skuNoBuilder = new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchAllQuery(), skuNoScore);
|
|
131
|
+ filterFunctionBuilders.add(skuNoBuilder);
|
|
132
|
+ FunctionScoreQueryBuilder.FilterFunctionBuilder[] builders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[filterFunctionBuilders.size()];
|
|
133
|
+ filterFunctionBuilders.toArray(builders);
|
|
134
|
+ FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(builders)
|
|
135
|
+ .scoreMode(FunctionScoreQuery.ScoreMode.SUM)
|
|
136
|
+ .setMinScore(2);
|
|
137
|
+ //聚合搜索则将结果放入过滤条件
|
|
138
|
+ filterBuilder.must(functionScoreQueryBuilder);
|
|
139
|
+ } else {
|
|
140
|
+ this.keywordSearchV2(filterBuilder, searchDTO.getKeyword());
|
|
141
|
+ }
|
|
142
|
+
|
|
143
|
+ //如果是聚合查询
|
|
144
|
+ nativeSearchQueryBuilder.withQuery(filterBuilder);
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+ if (pageVo != null && CharSequenceUtil.isNotEmpty(pageVo.getOrder()) && CharSequenceUtil.isNotEmpty(pageVo.getSort())) {
|
|
148
|
+ nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort(pageVo.getSort()).order(SortOrder.valueOf(pageVo.getOrder().toUpperCase())));
|
|
149
|
+ } else {
|
|
150
|
+ nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("releaseTime").order(SortOrder.DESC));
|
|
151
|
+ }
|
|
152
|
+ }
|
|
153
|
+ return nativeSearchQueryBuilder;
|
|
154
|
+ }
|
|
155
|
+
|
103
|
156
|
@Override
|
104
|
157
|
public List<String> getHotWords(Integer count) {
|
105
|
158
|
if (count == null) {
|
|
@@ -417,7 +470,7 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService {
|
417
|
470
|
//聚合搜索则将结果放入过滤条件
|
418
|
471
|
filterBuilder.must(functionScoreQueryBuilder);
|
419
|
472
|
} else {
|
420
|
|
- this.keywordSearch(filterBuilder, searchDTO.getKeyword());
|
|
473
|
+ this.keywordSearchV2(filterBuilder, searchDTO.getKeyword());
|
421
|
474
|
}
|
422
|
475
|
|
423
|
476
|
//如果是聚合查询
|
|
@@ -535,6 +588,16 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService {
|
535
|
588
|
* @param filterBuilder 过滤构造器
|
536
|
589
|
* @param keyword 关键字
|
537
|
590
|
*/
|
|
591
|
+ private void keywordSearchV2(BoolQueryBuilder filterBuilder, String keyword) {
|
|
592
|
+ filterBuilder.must(QueryBuilders.fuzzyQuery("goodsName", "*" + keyword + "*"));
|
|
593
|
+ }
|
|
594
|
+
|
|
595
|
+ /**
|
|
596
|
+ * 关键字查询处理
|
|
597
|
+ *
|
|
598
|
+ * @param filterBuilder 过滤构造器
|
|
599
|
+ * @param keyword 关键字
|
|
600
|
+ */
|
538
|
601
|
private void keywordSearch(BoolQueryBuilder filterBuilder, String keyword) {
|
539
|
602
|
List<FunctionScoreQueryBuilder.FilterFunctionBuilder> filterFunctionBuilders = new ArrayList<>();
|
540
|
603
|
if (keyword.contains(" ")) {
|