Browse Source

feat: 查法规版本之一

许家凯 2 năm trước cách đây
mục cha
commit
8c80c9bd3d

+ 21 - 26
src/main/java/com/winhc/phoenix/example/service/impl/LegislationServiceImpl.java

@@ -3,6 +3,7 @@ package com.winhc.phoenix.example.service.impl;
 import com.winhc.phoenix.example.dao.SearchDao;
 import com.winhc.phoenix.example.service.LegislationService;
 import com.winhc.phoenix.example.util.BigDecimalUtil;
+import com.winhc.phoenix.example.util.QueryBuilderUtils;
 import com.winhc.phoenix.example.util.company.search.CompanyIndexUtils;
 import com.winhc.phoenix.example.vo.legislation.LegislationSearchType;
 import com.winhc.phoenix.example.vo.legislation.LegislationSearchVo;
@@ -36,7 +37,7 @@ public class LegislationServiceImpl implements LegislationService {
 
 
     private final SearchDao searchDao;
-    public static final String index = "legislation_info_fx_v1";
+    public static final String index = "legislation_info_fx_v3";
     public static final String type = "legislation_info_fx_type";
 
     private static final List<String> highlightField = new ArrayList<String>() {{
@@ -72,37 +73,31 @@ public class LegislationServiceImpl implements LegislationService {
                 );
                 break;
             default:
+                boolQuery.should(matchQuery("title", content).boost(0))
+                        .should(termQuery("title.keyword", content).boost(0))
+                ;
+                boolQuery.should(matchPhraseQuery("content", content).boost(10))
+                        .should(matchQuery("content", content).minimumShouldMatch("100%").boost(5))
+                        .should(matchQuery("content", content).boost(0));
 
+                boolQuery.should(disMaxQuery()
+                        .add(matchPhraseQuery("title_keyword", content).boost(20))
+                        .add(QueryBuilderUtils.spanNearQuery4StandardAnalyzer("title_keyword.standard", content).boost(20))
+                        .add(termQuery("title_keyword.keyword", content).boost(20))
 
-                boolQuery.should(boolQuery().filter(boolQuery()
-//                        .should(matchQuery("content", content).minimumShouldMatch("100%"))
-                        .should(matchQuery("title", content))
-                        .should(termQuery("title.keyword", content))
-                ).boost(0));
-
-                boolQuery.should(boolQuery().filter(boolQuery()
-                                .should(matchPhraseQuery("content", content))
-                ).boost(25));
-
-                boolQuery.should(boolQuery().filter(boolQuery()
-                                .should(matchQuery("content", content).boost(20).minimumShouldMatch("100%"))
-                ).boost(20));
-
-                boolQuery.should(boolQuery().filter(boolQuery()
-                                .should(matchQuery("content", content))
-                ).boost(2));
-
+                        .add(QueryBuilderUtils.spanNearQuery4StandardAnalyzer("title.standard", content).boost(20))
+//                        .add(matchQuery("title.trim", content).boost(20).minimumShouldMatch("100%"))
+                        .add(termQuery("title.keyword", content).boost(100))
+                        .tieBreaker(0.3f)
+                );
 
-                boolQuery.should(boolQuery().should(disMaxQuery()
-//                        .add(matchPhraseQuery("content", content).boost(25))
-//                        .add(matchQuery("content", content).boost(20).minimumShouldMatch("100%"))
-//                        .add(matchQuery("content", content).boost(2))
-                        .add(disMaxQuery()
+                /*boolQuery.should(
+                        disMaxQuery()
                                 .add(matchQuery("title.standard", content).minimumShouldMatch("100%").boost(20))
                                 .add(matchQuery("title.trim", content).boost(20).minimumShouldMatch("100%"))
                                 .add(termQuery("title.keyword", content).boost(100))
-                                .tieBreaker(0.3f))
-                ));
+                                .tieBreaker(0.3f)
+                );*/
                 break;
         }
 

+ 15 - 2
src/main/java/com/winhc/phoenix/example/util/QueryBuilderUtils.java

@@ -37,16 +37,29 @@ public class QueryBuilderUtils {
 
 
     public static QueryBuilder getSpanNearQuery(String fields, String content) {
-        SpanNearQueryBuilder spanNearQueryBuilder = spanNearQuery(spanTermQuery(fields, content.charAt(0) + ""), 1);
+        return getSpanNearQuery(fields, content, 1);
+    }
+
+    public static QueryBuilder getSpanNearQuery(String fields, String content, int slop) {
+        SpanNearQueryBuilder spanNearQueryBuilder = spanNearQuery(spanTermQuery(fields, content.charAt(0) + ""), slop);
         for (int i = 1; i < content.length(); i++) {
             spanNearQueryBuilder.addClause(spanTermQuery(fields, content.charAt(i) + ""));
         }
+
+        if (spanNearQueryBuilder.clauses().size() == 1) {
+            return termQuery(fields, content);
+        }
         return spanNearQueryBuilder;
     }
 
 
     @SneakyThrows
     public static QueryBuilder spanNearQuery4StandardAnalyzer(String fields, String content) {
+        return spanNearQuery4StandardAnalyzer(fields, content, 0);
+    }
+
+    @SneakyThrows
+    public static QueryBuilder spanNearQuery4StandardAnalyzer(String fields, String content, int slop) {
         try (Analyzer analyzer = new StandardAnalyzer()) {
             TokenStream stream = analyzer.tokenStream(fields, content);
             CharTermAttribute cta = stream.addAttribute(CharTermAttribute.class);
@@ -55,7 +68,7 @@ public class QueryBuilderUtils {
             SpanNearQueryBuilder spanNearQueryBuilder = null;
             while (stream.incrementToken()) {
                 if (spanNearQueryBuilder == null) {
-                    spanNearQueryBuilder = spanNearQuery(spanTermQuery(fields, cta.toString()), 0);
+                    spanNearQueryBuilder = spanNearQuery(spanTermQuery(fields, cta.toString()), slop);
                 } else {
                     spanNearQueryBuilder.addClause(spanTermQuery(fields, cta.toString()));
                 }