Explorar el Código

商品搜索支持货号精准查询;失去全文检索能力

郑杰 hace 2 años
padre
commit
8e74e9101f

+ 69 - 6
framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java

@@ -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(" ")) {