许家凯 3 éve
szülő
commit
d8bd58e854
23 módosított fájl, 617 hozzáadás és 81 törlés
  1. 2 0
      src/main/java/com/winhc/phoenix/example/PhoenixExampleApplication.java
  2. 28 0
      src/main/java/com/winhc/phoenix/example/controller/InnerSearchCompanyController.java
  3. 3 3
      src/main/java/com/winhc/phoenix/example/controller/SearchController.java
  4. 23 0
      src/main/java/com/winhc/phoenix/example/controller/TaskController.java
  5. 2 0
      src/main/java/com/winhc/phoenix/example/dao/SearchDao.java
  6. 18 1
      src/main/java/com/winhc/phoenix/example/dao/impl/SearchDaoImpl.java
  7. 2 4
      src/main/java/com/winhc/phoenix/example/enums/EsVersion.java
  8. 9 0
      src/main/java/com/winhc/phoenix/example/enums/QueryType.java
  9. 1 1
      src/main/java/com/winhc/phoenix/example/framework/es/EsFastScan.java
  10. 1 28
      src/main/java/com/winhc/phoenix/example/job/BatchQueryEsTest.java
  11. 27 14
      src/main/java/com/winhc/phoenix/example/job/EsScanJob.java
  12. 62 0
      src/main/java/com/winhc/phoenix/example/scheduled/TaskStatusScheduled.java
  13. 11 0
      src/main/java/com/winhc/phoenix/example/service/InnerSearchCompanyService.java
  14. 11 0
      src/main/java/com/winhc/phoenix/example/service/TaskService.java
  15. 53 0
      src/main/java/com/winhc/phoenix/example/service/impl/InnerSearchCompanyServiceImpl.java
  16. 119 29
      src/main/java/com/winhc/phoenix/example/service/impl/SearchV8FastServiceImpl.java
  17. 31 0
      src/main/java/com/winhc/phoenix/example/service/impl/TaskServiceImpl.java
  18. 112 0
      src/main/java/com/winhc/phoenix/example/task/AsyncTask.java
  19. 17 0
      src/main/java/com/winhc/phoenix/example/util/CompanyNameUtils.java
  20. 36 0
      src/main/java/com/winhc/phoenix/example/util/DateUtils.java
  21. 46 0
      src/main/java/com/winhc/phoenix/example/util/MaxBatchQueryUtils.java
  22. 2 0
      src/main/java/com/winhc/phoenix/example/util/SortUtil.java
  23. 1 1
      src/main/resources/application.yml

+ 2 - 0
src/main/java/com/winhc/phoenix/example/PhoenixExampleApplication.java

@@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.SerializationFeature;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.context.annotation.Bean;
+import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -12,6 +13,7 @@ import org.springframework.web.bind.annotation.GetMapping;
 @SpringBootApplication
 @EnableScheduling
 @Controller
+@EnableAsync
 public class PhoenixExampleApplication {
 
     public static void main(String[] args) {

+ 28 - 0
src/main/java/com/winhc/phoenix/example/controller/InnerSearchCompanyController.java

@@ -0,0 +1,28 @@
+package com.winhc.phoenix.example.controller;
+
+import com.winhc.phoenix.example.service.InnerSearchCompanyService;
+import io.swagger.annotations.Api;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author: XuJiakai
+ * 2021/4/23 19:08
+ */
+@Slf4j
+@AllArgsConstructor
+@RestController
+@Api(tags = "内部搜索", value = "inner")
+@RequestMapping("inner")
+public class InnerSearchCompanyController {
+    private final InnerSearchCompanyService innerSearchCompanyService;
+
+    @GetMapping("query-company")
+    public Object query(@RequestParam String companyName){
+        return innerSearchCompanyService.searchCompanyName(companyName);
+    }
+}

+ 3 - 3
src/main/java/com/winhc/phoenix/example/controller/SearchController.java

@@ -31,7 +31,7 @@ public class SearchController {
     @Timer
     @ApiOperation(value = "es搜索")
     @GetMapping("query")
-    public Object query(String content, @RequestParam(defaultValue = "v8精简版") EsVersion version, @RequestParam(defaultValue = "0") int from, @RequestParam(defaultValue = "10") int size) {
+    public Object query(String content, @RequestParam(defaultValue = "v8版_Fast") EsVersion version, @RequestParam(defaultValue = "0") int from, @RequestParam(defaultValue = "10") int size) {
         return map.get(version.getValue()).query(cleanup(content), from, size);
     }
 
@@ -39,14 +39,14 @@ public class SearchController {
     @Timer
     @ApiOperation(value = "搜索对照组")
     @GetMapping("control")
-    public Object controlGroup(String content, @RequestParam(defaultValue = "v8精简版") EsVersion version) {
+    public Object controlGroup(String content, @RequestParam(defaultValue = "v8版_Fast") EsVersion version) {
         return map.get(version.getValue()).controlGroup(cleanup(content));
     }
 
     @Timer
     @ApiOperation(value = "搜索提示(测试中)")
     @GetMapping("tips")
-    public Object searchTips(String content, @RequestParam(defaultValue = "v8精简版") EsVersion version) {
+    public Object searchTips(String content, @RequestParam(defaultValue = "v8版_Fast") EsVersion version) {
         return map.get(version.getValue()).tips(cleanup(content));
     }
 

+ 23 - 0
src/main/java/com/winhc/phoenix/example/controller/TaskController.java

@@ -0,0 +1,23 @@
+package com.winhc.phoenix.example.controller;
+
+import com.winhc.phoenix.example.service.TaskService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+/**
+ * @author: XuJiakai
+ * 2021/5/18 13:49
+ */
+@Slf4j
+@RequestMapping("task")
+//@RestController
+@AllArgsConstructor
+public class TaskController {
+    private final TaskService taskService;
+
+//    @GetMapping("credit-punishment-touch")
+    public Object pullCreditPunishmentTouch(){
+        return taskService.pullCreditPunishmentTouch();
+    }
+}

+ 2 - 0
src/main/java/com/winhc/phoenix/example/dao/SearchDao.java

@@ -15,6 +15,8 @@ public interface SearchDao {
 
     Object search(String index, String type, QueryBuilder query, SortBuilder sortBuilder, FetchSourceContext fetchSourceContext, int from, int size);
 
+    Object search(String index, String type, QueryBuilder query, int from, int size);
+
     Object search(String index, String type, QueryBuilder query, RescoreBuilder rescoreBuilder, SortBuilder sortBuilder, FetchSourceContext fetchSourceContext, int from, int size);
 
     boolean deleteByIds(String index, String type, List<String> ids);

+ 18 - 1
src/main/java/com/winhc/phoenix/example/dao/impl/SearchDaoImpl.java

@@ -47,14 +47,31 @@ public class SearchDaoImpl implements SearchDao {
         return search(index, type, query, null, sortBuilder, fetchSourceContext, from, size);
     }
 
+    @Override
+    public Object search(String index, String type, QueryBuilder query, int from, int size) {
+        return search(index, type, query, null, null, from, size);
+    }
+
     @SneakyThrows
     @Override
     public Object search(String index, String type, QueryBuilder query, RescoreBuilder rescoreBuilder, SortBuilder sortBuilder, FetchSourceContext fetchSourceContext, int from, int size) {
+      /*  HighlightBuilder.Field query1 = new HighlightBuilder.Field("history_name.value").highlightQuery(QueryBuilders.matchQuery("history_name.value", "华为"));
+        HighlightBuilder.Field query3 = new HighlightBuilder.Field("history_name.value.keyword").highlightQuery(QueryBuilders.matchQuery("history_name.value", "华为").boost(10000));
+        HighlightBuilder.Field query2 = new HighlightBuilder
+                .Field("cname.value")
+                .highlightQuery(QueryBuilders.matchQuery("cname.value", "华为").boost(1000));*/
+        HighlightBuilder highlightBuilder = new HighlightBuilder()
+//                .field(query1)
+//                .field(query2)
+//                .field(query3)
+                .preTags("<font color='red'>")
+                .postTags("</font>")
+                .order("score");
         SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder()
                 .query(query)
                 .from(from)
                 .size(size)
-                .highlighter(new HighlightBuilder().field("*").preTags("<font color='red'>").postTags("</font>"));
+                .highlighter(highlightBuilder);
 
         if (rescoreBuilder != null) {
             searchSourceBuilder.addRescorer(rescoreBuilder)

+ 2 - 4
src/main/java/com/winhc/phoenix/example/enums/EsVersion.java

@@ -1,8 +1,6 @@
 package com.winhc.phoenix.example.enums;
 
-import com.winhc.phoenix.example.service.impl.SearchV7ServiceImpl;
 import com.winhc.phoenix.example.service.impl.SearchV8ServiceImpl;
-import com.winhc.phoenix.example.service.impl.SearchV8SimpServiceImpl;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 
@@ -13,8 +11,8 @@ import lombok.Getter;
 @Getter
 @AllArgsConstructor
 public enum EsVersion {
-    v7版(SearchV7ServiceImpl.index),
-    v8精简版(SearchV8SimpServiceImpl.index),
+//    v7版(SearchV7ServiceImpl.index),
+//    v8精简版(SearchV8SimpServiceImpl.index),
     v8版(SearchV8ServiceImpl.index),
     v8版_Fast("v8_fast");
     private final String value;

+ 9 - 0
src/main/java/com/winhc/phoenix/example/enums/QueryType.java

@@ -0,0 +1,9 @@
+package com.winhc.phoenix.example.enums;
+
+/**
+ * @author: XuJiakai
+ * 2021/6/16 11:47
+ */
+public enum QueryType {
+    COMPANY, PERSON, COMPANY_OR_IP, OTHER
+}

+ 1 - 1
src/main/java/com/winhc/phoenix/example/framework/es/EsFastScan.java

@@ -65,7 +65,7 @@ public class EsFastScan {
                 poolSize, poolSize,
                 0L, TimeUnit.MILLISECONDS,
                 objects,
-                new ThreadFactoryBuilder().setNameFormat("ScanEs-pool-").build(),
+                new ThreadFactoryBuilder().setNameFormat("ScanEs-pool").build(),
                 (r, executor) -> {
                     try {
                         executor.getQueue().put(r);

+ 1 - 28
src/main/java/com/winhc/phoenix/example/job/BatchQueryEsTest.java

@@ -20,6 +20,7 @@ import org.springframework.stereotype.Component;
 
 import java.util.*;
 
+import static com.winhc.phoenix.example.util.MaxBatchQueryUtils.addTerms;
 /**
  * @author: XuJiakai
  * 2021/3/1 09:43
@@ -120,32 +121,4 @@ public class BatchQueryEsTest {
         return mapper.readValue(search.toString(), typeRef);
     }
 
-    private static BoolQueryBuilder addTerms(Set<String> ids, String key) {
-        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
-        List<List<String>> lists = fixedGrouping(new ArrayList<>(ids), 1024);
-        for (List<String> list : lists) {
-            boolQuery.should(QueryBuilders.termsQuery(key, list));
-        }
-        return boolQuery;
-    }
-
-
-    public static <T> List<List<T>> fixedGrouping(List<T> source, int n) {
-        if (null == source || source.size() == 0 || n <= 0)
-            return null;
-        List<List<T>> result = new ArrayList<>();
-        int remainder = source.size() % n;
-        int size = (source.size() / n);
-        for (int i = 0; i < size; i++) {
-            List<T> subset = null;
-            subset = source.subList(i * n, (i + 1) * n);
-            result.add(subset);
-        }
-        if (remainder > 0) {
-            List<T> subset = null;
-            subset = source.subList(size * n, size * n + remainder);
-            result.add(subset);
-        }
-        return result;
-    }
 }

+ 27 - 14
src/main/java/com/winhc/phoenix/example/job/EsScanJob.java

@@ -2,6 +2,7 @@ package com.winhc.phoenix.example.job;
 
 import com.mongodb.client.MongoCollection;
 import com.winhc.phoenix.example.framework.es.EsFastScan;
+import com.winhc.phoenix.example.util.DateUtils;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.bson.Document;
@@ -27,6 +28,30 @@ public class EsScanJob {
     private final MongoTemplate mongoTemplate;
 
     public void start() {
+    }
+
+
+    public void fixBugByDeleted(String dsl, String tn) {
+        String ymd = DateUtils.getYesterday_ymd();
+
+        MongoCollection<Document> person = mongoTemplate.getCollection("company_back_update_0423");
+        Consumer<SearchHit[]> func = list -> {
+            List<Document> li = Arrays.stream(list).map(d -> {
+                String id = d.getId();
+                Document document = new Document();
+                // document.put("_id", id);
+                document.put("rowkey", id);
+                document.put("ds", ymd);
+                document.put("tn", tn);
+                return document;
+            }).collect(Collectors.toList());
+            person.insertMany(li);
+        };
+
+        new EsFastScan(restHighLevelClient, func, "winhc_index_" + tn + "_v1", "_doc", dsl).scan();
+    }
+
+    public void fixBugByDeleted(String tn) {
         String dsl = "{\n" +
                 "  \"query\": {\n" +
                 "    \"bool\": {\n" +
@@ -42,21 +67,9 @@ public class EsScanJob {
                 "    }\n" +
                 "  }\n" +
                 "}";
-        MongoCollection<Document> person = mongoTemplate.getCollection("xjk_company_equity_info_deleted_error");
-        Consumer<SearchHit[]> func = list -> {
-            List<Document> li = Arrays.stream(list).map(d -> {
-                String id = d.getId();
-                Document document = new Document();
-                document.put("_id", id);
-                document.put("rowkey", id);
-                document.put("ds", "20210422");
-                document.put("tn", "company_equity_info");
-                return document;
-            }).collect(Collectors.toList());
-            person.insertMany(li);
-        };
 
-        new EsFastScan(restHighLevelClient, func, "winhc_index_company_equity_info_v1", "_doc", dsl).scan();
+        fixBugByDeleted(dsl, tn);
+
     }
 
 }

+ 62 - 0
src/main/java/com/winhc/phoenix/example/scheduled/TaskStatusScheduled.java

@@ -0,0 +1,62 @@
+package com.winhc.phoenix.example.scheduled;
+
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.Future;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * @author: XuJiakai
+ * 2021/5/18 15:19
+ */
+@Slf4j
+//@Component
+public class TaskStatusScheduled {
+
+    private AtomicBoolean atomicBoolean = new AtomicBoolean(false);
+
+    private ArrayBlockingQueue<Future<Boolean>> queue = new ArrayBlockingQueue(1);
+
+
+    @SneakyThrows
+    public boolean isIdle() {
+        while (atomicBoolean.get()) {
+            log.info("put waiting ...");
+            Thread.sleep(3000);
+        }
+        return queue.isEmpty();
+    }
+
+
+    @SneakyThrows
+    public void put(Future<Boolean> future) {
+        log.info("put future !");
+        queue.put(future);
+        log.info("queue size:{}", queue.size());
+    }
+
+    @Scheduled(cron = "0/20 * * * * ? ")
+    public void polling() {
+        log.info("task status polling ...");
+        if (queue.isEmpty()) {
+            return;
+        }
+        try {
+            atomicBoolean.set(true);
+            Future<Boolean> peek = queue.poll();
+            if (peek.isDone()) {
+                log.info("任务状态:{}", peek.get());
+            } else {
+                log.info("waiting ...");
+                queue.put(peek);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        } finally {
+            atomicBoolean.set(false);
+        }
+    }
+}

+ 11 - 0
src/main/java/com/winhc/phoenix/example/service/InnerSearchCompanyService.java

@@ -0,0 +1,11 @@
+package com.winhc.phoenix.example.service;
+
+/**
+ * @author: XuJiakai
+ * 2021/4/23 19:00
+ */
+public interface InnerSearchCompanyService {
+
+    Object searchCompanyName(String companyName);
+
+}

+ 11 - 0
src/main/java/com/winhc/phoenix/example/service/TaskService.java

@@ -0,0 +1,11 @@
+package com.winhc.phoenix.example.service;
+
+/**
+ * @author: XuJiakai
+ * 2021/5/18 13:51
+ */
+public interface TaskService {
+
+    String pullCreditPunishmentTouch();
+
+}

+ 53 - 0
src/main/java/com/winhc/phoenix/example/service/impl/InnerSearchCompanyServiceImpl.java

@@ -0,0 +1,53 @@
+package com.winhc.phoenix.example.service.impl;
+
+import com.winhc.phoenix.example.dao.SearchDao;
+import com.winhc.phoenix.example.service.InnerSearchCompanyService;
+import com.winhc.phoenix.example.util.CompanyNameUtils;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.elasticsearch.index.query.BoolQueryBuilder;
+import org.elasticsearch.index.query.MultiMatchQueryBuilder;
+import org.springframework.stereotype.Service;
+
+import static org.elasticsearch.index.query.QueryBuilders.*;
+
+/**
+ * @author: XuJiakai
+ * 2021/4/23 19:01
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class InnerSearchCompanyServiceImpl implements InnerSearchCompanyService {
+    private final SearchDao searchDao;
+
+    public static final String index = "winhc-company-v8";
+    public static final String type = "company";
+
+
+    @Override
+    public Object searchCompanyName(String companyName) {
+        return searchDao.search(index, type, getBoolQuery(companyName), 0, 5);
+    }
+
+    private BoolQueryBuilder getBoolQuery(String companyName) {
+        BoolQueryBuilder boolQuery = boolQuery();
+        String content = CompanyNameUtils.cleanup(companyName);
+
+
+        boolQuery.should(termQuery("cname.value.keyword", content).boost(1000));
+        boolQuery.should(termQuery("history_name.value.keyword", content).boost(1000));
+        boolQuery.should(multiMatchQuery(companyName)
+                .type(MultiMatchQueryBuilder.Type.CROSS_FIELDS)
+                .minimumShouldMatch("5<85%")
+                .tieBreaker(0.3F)
+                .field("cname.value", 16)
+                .field("history_name.value", 12)
+                .field("cname.value.pinyin", 6)
+                .field("history_name.value.pinyin", 6)
+
+        );
+
+        return boolQuery;
+    }
+}

+ 119 - 29
src/main/java/com/winhc/phoenix/example/service/impl/SearchV8FastServiceImpl.java

@@ -2,11 +2,12 @@ package com.winhc.phoenix.example.service.impl;
 
 import com.winhc.phoenix.example.dao.SearchDao;
 import com.winhc.phoenix.example.service.SearchService;
-import com.winhc.phoenix.example.util.SortUtil;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.elasticsearch.index.query.*;
 import org.elasticsearch.index.query.functionscore.ScriptScoreFunctionBuilder;
+import org.elasticsearch.script.Script;
+import org.elasticsearch.script.ScriptType;
 import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
 import org.elasticsearch.search.rescore.QueryRescoreMode;
 import org.elasticsearch.search.rescore.QueryRescorerBuilder;
@@ -17,6 +18,8 @@ import org.elasticsearch.search.sort.SortOrder;
 import org.springframework.context.annotation.Primary;
 import org.springframework.stereotype.Service;
 
+import java.util.HashMap;
+import java.util.Map;
 import java.util.regex.Pattern;
 
 import static org.elasticsearch.index.query.QueryBuilders.*;
@@ -32,7 +35,8 @@ import static org.elasticsearch.index.query.QueryBuilders.*;
 public class SearchV8FastServiceImpl implements SearchService {
     private SearchDao searchDao;
 
-    public static final String index = "winhc-company-v8";
+//        public static final String index = "winhc-company-v8";
+    public static final String index = "winhc-company-v8_3";
     public static final String type = "company";
     private static final String[] includes = new String[]{"cname", "legal_entity*", "estiblish_time", "reg_status_std", "company_type", "province_code", "reg_capital", "logo", "new_cid"};
     private static final FetchSourceContext fetchSourceContext = new FetchSourceContext(true, includes, null);
@@ -50,7 +54,7 @@ public class SearchV8FastServiceImpl implements SearchService {
         FieldSortBuilder company_score_weight = SortBuilders.fieldSort("company_score_weight").order(SortOrder.DESC);
 
 
-        Object search = searchDao.search(index, type, queryBuilder, company_score_weight, fetchSourceContext_tips, 0, 5);
+        Object search = searchDao.search(index, type, queryBuilder, company_score_weight, null, 0, 5);
         return search;
     }
 
@@ -63,13 +67,17 @@ public class SearchV8FastServiceImpl implements SearchService {
     @Override
     public Object query(String content, int from, int size) {
         BoolQueryBuilder boolQuery = getBoolQuery(content);
-        ScriptSortBuilder scriptSortBuilder = SortUtil.getInstance().fastSort;
+        Map<String, Object> map = new HashMap<String, Object>() {{
+            put("query_content", content);
+        }};
+        ScriptSortBuilder scriptSortBuilder = new ScriptSortBuilder(new Script(ScriptType.STORED, null, "company-search-script", map), ScriptSortBuilder.ScriptSortType.NUMBER).order(SortOrder.DESC);
+
 
         QueryRescorerBuilder rescorerBuilder = new QueryRescorerBuilder(functionScoreQuery(new ScriptScoreFunctionBuilder(scriptSortBuilder.script())))
                 .windowSize(50)
                 .setScoreMode(QueryRescoreMode.Multiply);
 
-        Object search = searchDao.search(index, type, boolQuery, rescorerBuilder, null, fetchSourceContext, from, size);
+        Object search = searchDao.search(index, type, boolQuery, rescorerBuilder, null, fetchSourceContext_tips, from, size);
         return search;
     }
 
@@ -77,23 +85,96 @@ public class SearchV8FastServiceImpl implements SearchService {
     private BoolQueryBuilder getBoolQuery(String content) {
         BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
 
-
         boolQuery.should(termQuery("cname.value.keyword", content).boost(1000));
         boolQuery.should(termQuery("history_name.value.keyword", content).boost(1000));
 
+        boolQuery.should(disMaxQuery()
+                        .add(disMaxQuery()
+                                .add(termQuery("legal_entity_name.keyword", content).boost(10))
+                                .add(termQuery("holder.name.keyword", content).boost(5.5F))
+                                .add(termQuery("staff.name.keyword", content).boost(5.5F))
+                                .tieBreaker(0.3F)
+                        ).add(disMaxQuery()
+
+                                .add(matchQuery("legal_entity_name", content).boost(6).minimumShouldMatch("5<95%"))
+//                        .add(matchQuery("holder", content).boost(10).minimumShouldMatch("5<80%"))
+//                        .add(matchQuery("staff", content).boost(6).minimumShouldMatch("5<80%"))
+
+//                        .add(matchPhraseQuery("legal_entity_name", content).boost(6).slop(3))
+                                .add(matchPhraseQuery("holder.name", content).boost(10).slop(3))
+                                .add(matchPhraseQuery("staff.name", content).boost(6).slop(3))
+
+                                .tieBreaker(0.3F)
+                        ).tieBreaker(0.3F)
+        );
+        boolQuery.should(disMaxQuery()
+                        .add(disMaxQuery()
+                                .add(termQuery("icp.keyword", content).boost(20))
+                                .add(termQuery("app_info.keyword", content).boost(40))
+                                .add(termQuery("company_tm.keyword", content).boost(20))
+                                .tieBreaker(0.4F))
+                        .add(disMaxQuery()
+//                        .add(matchQuery("icp", content).boost(8).minimumShouldMatch("5"))
+//                        .add(matchQuery("app_info", content).boost(19).minimumShouldMatch("5"))
+//                        .add(matchQuery("company_tm", content).boost(7).minimumShouldMatch("5"))
+
+
+                                        .add(matchPhraseQuery("icp", content).boost(8).slop(3))
+                                        .add(matchPhraseQuery("app_info", content).boost(19).slop(3))
+                                        .add(matchPhraseQuery("company_tm", content).boost(7).slop(3))
+
+                                        .tieBreaker(0.3F)
+                        ).tieBreaker(0.4F)
+        );
+
+
+        boolQuery.should(
+                disMaxQuery()
+                        .add(multiMatchQuery(content)
+                                .type(MultiMatchQueryBuilder.Type.CROSS_FIELDS)
+                                .minimumShouldMatch("5<90%")
+                                .tieBreaker(0.3F)
+
+                                .field("cname.value", 16)
+                                .field("history_name.value", 12))
+                        .add(multiMatchQuery(content)
+                                .operator(Operator.AND)
+                                .type(MultiMatchQueryBuilder.Type.CROSS_FIELDS)
+                                .tieBreaker(0.3F)
+                                .field("cname.value.standard", 16)
+                                .field("history_name.value.standard", 12))
+                        .tieBreaker(0.4F)
+        );
+
+
+        BoolQueryBuilder boolQuery2 = QueryBuilders.boolQuery()
+                .filter(termQuery("deleted", "0"))
+                .filter(rangeQuery("company_score_weight").gt(0.3F))
+                .must(boolQuery);
+        return boolQuery2;
+    }
+
+
+    private BoolQueryBuilder getPersonQuery(String content) {
+        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
+
+        boolQuery.should(termQuery("cname.value.keyword", content).boost(1000));
+        boolQuery.should(termQuery("history_name.value.keyword", content).boost(1000));
 
         boolQuery.should(disMaxQuery()
                 .add(disMaxQuery()
                         .add(termQuery("legal_entity_name.keyword", content).boost(10))
                         .add(termQuery("holder.name.keyword", content).boost(5.5F))
                         .add(termQuery("staff.name.keyword", content).boost(5.5F))
-                        .tieBreaker(0.3F))
-                .add(disMaxQuery()
-                        .add(matchQuery("legal_entity_name", content).boost(6).minimumShouldMatch("5<80%"))
-                        .add(matchQuery("holder", content).boost(10).minimumShouldMatch("5<80%"))
-                        .add(matchQuery("staff", content).boost(6).minimumShouldMatch("5<80%"))
                         .tieBreaker(0.3F)
-                ).tieBreaker(0.3F)
+                ).add(disMaxQuery()
+                        .add(matchQuery("legal_entity_name", content).boost(6).minimumShouldMatch("5<95%"))
+                        .add(matchPhraseQuery("holder.name", content).boost(10).slop(3))
+                        .add(matchPhraseQuery("staff.name", content).boost(6).slop(3))
+                        .tieBreaker(0.3F)
+                )
+                .boost(2f)
+                .tieBreaker(0.3F)
         );
 
 
@@ -102,28 +183,36 @@ public class SearchV8FastServiceImpl implements SearchService {
                         .add(termQuery("icp.keyword", content).boost(20))
                         .add(termQuery("app_info.keyword", content).boost(40))
                         .add(termQuery("company_tm.keyword", content).boost(20))
-                        .tieBreaker(0.4F)
-                )
-                .add(
-                        disMaxQuery()
-                                .add(matchQuery("icp", content).boost(8).minimumShouldMatch("5"))
-                                .add(matchQuery("app_info", content).boost(19).minimumShouldMatch("5"))
-                                .add(matchQuery("company_tm", content).boost(7).minimumShouldMatch("5"))
-                                .tieBreaker(0.3F)
-                )
+                        .tieBreaker(0.4F))
+                .add(disMaxQuery()
+                        .add(matchPhraseQuery("icp", content).boost(8).slop(3))
+                        .add(matchPhraseQuery("app_info", content).boost(19).slop(3))
+                        .add(matchPhraseQuery("company_tm", content).boost(7).slop(3))
 
-                .tieBreaker(0.4F)
+                        .tieBreaker(0.3F)
+                )
+                .boost(0.5f)
+                .tieBreaker(0.1F)
         );
 
 
-        boolQuery.should(multiMatchQuery(content)
-//                .operator(Operator.AND)
-                .type(MultiMatchQueryBuilder.Type.CROSS_FIELDS)
-                .minimumShouldMatch("5<85%")
-                .tieBreaker(0.3F)
-                .field("cname.value", 16)
-                .field("history_name.value", 12)
+        boolQuery.should(
+                disMaxQuery()
+                        .add(multiMatchQuery(content)
+                                .type(MultiMatchQueryBuilder.Type.CROSS_FIELDS)
+                                .minimumShouldMatch("5<90%")
+                                .tieBreaker(0.3F)
 
+                                .field("cname.value", 16)
+                                .field("history_name.value", 12))
+                        .add(multiMatchQuery(content)
+                                .operator(Operator.AND)
+                                .type(MultiMatchQueryBuilder.Type.CROSS_FIELDS)
+                                .tieBreaker(0.3F)
+                                .field("cname.value.standard", 16)
+                                .field("history_name.value.standard", 12))
+                        .boost(0.5f)
+                        .tieBreaker(0.1F)
         );
 
 
@@ -134,6 +223,7 @@ public class SearchV8FastServiceImpl implements SearchService {
         return boolQuery2;
     }
 
+
     private static final Pattern pattern = Pattern.compile("^[a-zA-Z ]*$");
 
     private static boolean is_pinyin(String str) {

+ 31 - 0
src/main/java/com/winhc/phoenix/example/service/impl/TaskServiceImpl.java

@@ -0,0 +1,31 @@
+package com.winhc.phoenix.example.service.impl;
+
+import com.winhc.phoenix.example.scheduled.TaskStatusScheduled;
+import com.winhc.phoenix.example.service.TaskService;
+import com.winhc.phoenix.example.task.AsyncTask;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.concurrent.Future;
+
+/**
+ * @author: XuJiakai
+ * 2021/5/18 13:51
+ */
+@Slf4j
+//@Service
+@AllArgsConstructor
+public class TaskServiceImpl implements TaskService {
+    private final AsyncTask asyncTask;
+    private final TaskStatusScheduled taskStatusScheduled;
+
+    @Override
+    public synchronized String pullCreditPunishmentTouch() {
+        if (!taskStatusScheduled.isIdle()) {
+            return "任务队列中有未完成的任务,请务重复调用!";
+        }
+        Future<Boolean> booleanFuture = asyncTask.pullCreditPunishmentTouch();
+        taskStatusScheduled.put(booleanFuture);
+        return "ok";
+    }
+}

+ 112 - 0
src/main/java/com/winhc/phoenix/example/task/AsyncTask.java

@@ -0,0 +1,112 @@
+package com.winhc.phoenix.example.task;
+
+import com.mongodb.client.MongoCollection;
+import com.winhc.phoenix.example.framework.es.EsFastScan;
+import lombok.AllArgsConstructor;
+import org.bson.Document;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.elasticsearch.search.SearchHit;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.AsyncResult;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Future;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+
+/**
+ * @author: XuJiakai
+ * 2021/5/18 13:56
+ */
+@Component
+@AllArgsConstructor
+public class AsyncTask {
+    private final RestHighLevelClient restHighLevelClient;
+    private final MongoTemplate mongoTemplate;
+
+    @Async
+    public Future<Boolean> pullCreditPunishmentTouch() {
+
+        String dsl = "{\n" +
+                "    \"_source\": [\"case_no\", \"name\", \"rowkey\"],\n" +
+                "    \"query\": {\n" +
+                "        \"bool\": {\n" +
+                "            \"filter\": {\n" +
+                "                \"bool\": {\n" +
+                "                    \"should\": [\n" +
+                "                        {\n" +
+                "                            \"bool\": {\n" +
+                "                                \"must\": [\n" +
+                "                                    {\"terms\": {\n" +
+                "                                        \"label\": [\n" +
+                "                                            \"失信被执行人\",\n" +
+                "                                            \"被执行人\",\n" +
+                "                                            \"终本案件\"\n" +
+                "                                        ]\n" +
+                "                                    }}, {\n" +
+                "                                        \"term\": {\n" +
+                "                                            \"deleted\": {\n" +
+                "                                                \"value\": \"0\"\n" +
+                "                                            }\n" +
+                "                                        }\n" +
+                "                                    }\n" +
+                "                                ]\n" +
+                "                            }\n" +
+                "                        }, {\n" +
+                "                            \"bool\": {\n" +
+                "                                \"must\": [\n" +
+                "                                    {\"term\": {\n" +
+                "                                        \"deleted\": {\n" +
+                "                                            \"value\": \"0\"\n" +
+                "                                        }\n" +
+                "                                    }}, {\n" +
+                "                                        \"term\": {\n" +
+                "                                            \"label\": {\n" +
+                "                                                \"value\": \"限制高消费\"\n" +
+                "                                            }\n" +
+                "                                        }\n" +
+                "                                    }, {\n" +
+                "                                        \"script\": {\n" +
+                "                                            \"script\": \"if(doc['keyno'].value==null)return false; else return !(doc['keyno'].value.length()==32)\"\n" +
+                "                                        }\n" +
+                "                                    }\n" +
+                "                                ]\n" +
+                "                            }\n" +
+                "                        }\n" +
+                "                    ]\n" +
+                "                }\n" +
+                "            }\n" +
+                "        }\n" +
+                "    }\n" +
+                "}";
+        try {
+            MongoCollection<Document> person = mongoTemplate.getCollection("credit_punishment_case_info_xjk");
+            Consumer<SearchHit[]> func = list -> {
+                List<Document> li = Arrays.stream(list).map(d -> {
+                    String id = d.getId();
+                    Map<String, Object> sourceAsMap = d.getSourceAsMap();
+                    Object case_no = sourceAsMap.get("case_no");
+                    Object name = sourceAsMap.get("name");
+                    Object rowkey = sourceAsMap.get("rowkey");
+
+                    Document document = new Document();
+                    document.put("doc_id", id);
+                    document.put("case_no", case_no);
+                    document.put("name", name);
+                    document.put("rowkey", rowkey);
+                    return document;
+                }).collect(Collectors.toList());
+                person.insertMany(li);
+            };
+
+            new EsFastScan(restHighLevelClient, func, "credit_punishment_case_info_v1", "_doc", dsl).scan();
+            return new AsyncResult<>(true);
+        } catch (Exception e) {
+            return new AsyncResult<>(false);
+        }
+    }
+}

+ 17 - 0
src/main/java/com/winhc/phoenix/example/util/CompanyNameUtils.java

@@ -0,0 +1,17 @@
+package com.winhc.phoenix.example.util;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.regex.Pattern;
+
+/**
+ * @author: XuJiakai
+ * 2021/4/23 19:04
+ */
+public class CompanyNameUtils {
+    private static final Pattern pattern = Pattern.compile("[^\\u4e00-\\u9fa50-9a-zA-Z]");
+
+    public static String cleanup(String val) {
+        return StringUtils.isNotBlank(val) ? pattern.matcher(val).replaceAll("") : "";
+    }
+}

+ 36 - 0
src/main/java/com/winhc/phoenix/example/util/DateUtils.java

@@ -0,0 +1,36 @@
+package com.winhc.phoenix.example.util;
+
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.util.Locale;
+
+/**
+ * @Author: XuJiakai
+ * @Date: 2020/7/20 13:48
+ * @Description:
+ */
+public class DateUtils {
+    private static final DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd")
+            .withLocale(Locale.CHINA)
+            .withZone(ZoneId.systemDefault());
+    private static final DateTimeFormatter ymd_df = DateTimeFormatter.ofPattern("yyyyMMdd")
+            .withLocale(Locale.CHINA)
+            .withZone(ZoneId.systemDefault());
+
+    public static String getYesterday() {
+        Instant instant = Instant.now().minus(1, ChronoUnit.DAYS);
+        return df.format(instant);
+    }
+
+    public static String getYesterday_ymd() {
+        Instant instant = Instant.now().minus(1, ChronoUnit.DAYS);
+        return ymd_df.format(instant);
+    }
+
+    public static String getMinusDay(Integer i) {
+        Instant instant = Instant.now().minus(i, ChronoUnit.DAYS);
+        return df.format(instant);
+    }
+}

+ 46 - 0
src/main/java/com/winhc/phoenix/example/util/MaxBatchQueryUtils.java

@@ -0,0 +1,46 @@
+package com.winhc.phoenix.example.util;
+
+import org.elasticsearch.index.query.BoolQueryBuilder;
+import org.elasticsearch.index.query.QueryBuilders;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author: XuJiakai
+ * 2021/5/28 17:05
+ * 超长terms 查询
+ * 突破1024限制
+ */
+public class MaxBatchQueryUtils {
+
+    public static BoolQueryBuilder addTerms(Set<String> ids, String key) {
+        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
+        List<List<String>> lists = fixedGrouping(new ArrayList<>(ids), 1024);
+        for (List<String> list : lists) {
+            boolQuery.should(QueryBuilders.termsQuery(key, list));
+        }
+        return boolQuery;
+    }
+
+
+    private static <T> List<List<T>> fixedGrouping(List<T> source, int n) {
+        if (null == source || source.size() == 0 || n <= 0)
+            return null;
+        List<List<T>> result = new ArrayList<>();
+        int remainder = source.size() % n;
+        int size = (source.size() / n);
+        for (int i = 0; i < size; i++) {
+            List<T> subset = null;
+            subset = source.subList(i * n, (i + 1) * n);
+            result.add(subset);
+        }
+        if (remainder > 0) {
+            List<T> subset = null;
+            subset = source.subList(size * n, size * n + remainder);
+            result.add(subset);
+        }
+        return result;
+    }
+}

+ 2 - 0
src/main/java/com/winhc/phoenix/example/util/SortUtil.java

@@ -22,6 +22,8 @@ public class SortUtil {
     }
 
 
+
+
     public ScriptSortBuilder fastSort = new ScriptSortBuilder(new Script(ScriptType.INLINE, "painless", "return doc['company_score_weight'].value;", new HashMap<>()), ScriptSortBuilder.ScriptSortType.NUMBER).order(SortOrder.DESC);
 
 

+ 1 - 1
src/main/resources/application.yml

@@ -81,7 +81,7 @@ spring:
 es:
   username: elastic
   password: elastic_168
-  host: es-cn-0pp0r32zf000ipovd.elasticsearch.aliyuncs.com
+  host: es-cn-oew22t8bw002iferu.elasticsearch.aliyuncs.com #es-cn-0pp0r32zf000ipovd.elasticsearch.aliyuncs.com
 
 hbase:
   config: