Browse Source

领域检索支持同义词

xiaoqiao 6 months ago
parent
commit
378c04464b

+ 2 - 5
src/main/java/com/bowintek/practice/controller/TempController.java

@@ -31,10 +31,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletResponse;
 import java.io.*;
 import java.net.URLEncoder;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
+import java.util.*;
 
 @RestController
 @RequestMapping("/api/temp")
@@ -182,7 +179,7 @@ public class TempController {
     @GetMapping("/getAnalyze")
     public BaseResponse getAnalyze(String text) {
         //分词器拆条件查询用法
-        List<ComparisonResult> results = analyzeService.analyzeJavas(text);
+        List<ComparisonResult> results = analyzeService.analyzeJavas(new ArrayList<>(),new ArrayList<>(), text);
         return RespGenerstor.success(results);
     }
 }

+ 79 - 30
src/main/java/com/bowintek/practice/services/impl/AnalyzeServiceImpl.java

@@ -12,6 +12,7 @@ import com.bowintek.practice.vo.Analyze.AnalyzeModel;
 import com.bowintek.practice.vo.Analyze.ComparisonResult;
 import com.bowintek.practice.vo.EsIndexVo;
 import com.bowintek.practice.vo.EsIndexfieldVo;
+import org.apache.commons.beanutils.BeanUtils;
 import org.elasticsearch.client.RequestOptions;
 import org.elasticsearch.client.RestHighLevelClient;
 import org.elasticsearch.client.indices.AnalyzeRequest;
@@ -21,11 +22,13 @@ import org.springframework.stereotype.Component;
 
 import java.io.IOException;
 import java.io.StringReader;
+import java.lang.reflect.InvocationTargetException;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.sql.Timestamp;
 
+import org.springframework.util.Assert;
 import org.wltea.analyzer.cfg.DefaultConfig;
 import org.wltea.analyzer.core.IKSegmenter;
 import org.wltea.analyzer.core.Lexeme;
@@ -53,6 +56,8 @@ public class AnalyzeServiceImpl implements AnalyzeService {
     private static HashMap<String, AnalyzeModel> mapUseless = new HashMap<>();
     //对象分词
     private static HashMap<String, AnalyzeModel> mapObjects = new HashMap<>();
+    private static List<String> indexCache = null;
+    private static List<EsIndexfieldVo> indexFields = null;
 
     private void initStaticWords() {
         if (isInitStaticWords) return;
@@ -116,9 +121,7 @@ public class AnalyzeServiceImpl implements AnalyzeService {
             if (refTime == null || refTime.getTime() < keyword.getCreateTime().getTime())
                 refTime = keyword.getCreateTime();
         }
-        EsIndexVo indexModel = esIndexService.getAllList().get(0);
-
-        sysMainDict(indexModel.getFieldList());
+        sysMainDict(indexFields);
     }
 
     private void sysMainDict(List<EsIndexfieldVo> fields) {
@@ -153,17 +156,14 @@ public class AnalyzeServiceImpl implements AnalyzeService {
         if (colls.size() > 0) dictionary.addWords(colls);
     }
 
-    @Override
-    public AnalyzeResponse analyze(String text) {
+    public List<AnalyzeModel> analyze(String text) {
         try {
-            AnalyzeRequest request =AnalyzeRequest.withGlobalAnalyzer("ik_smart",text) ;
-            AnalyzeResponse response = highLevelClient.indices().analyze(request, RequestOptions.DEFAULT);
-            System.out.println(response.toString());
-            return response;
+            AnalyzeRequest request = AnalyzeRequest.withGlobalAnalyzer("ik_max_word", text);
+            return getAnalyzeModels(request);
         } catch (Exception ex) {
             ex.printStackTrace();
             return null;
-        }finally {
+        } finally {
             /*try {
                 highLevelClient.close();
             } catch (IOException e) {
@@ -172,17 +172,51 @@ public class AnalyzeServiceImpl implements AnalyzeService {
         }
     }
 
+    public List<AnalyzeModel> analyzeSynonym(String text) {
+        try {
+            AnalyzeRequest request = AnalyzeRequest.withIndexAnalyzer(indexCache.get(0), "ik_search_analyzer", text);
+            return getAnalyzeModels(request);
+        } catch (Exception ex) {
+            ex.printStackTrace();
+            return null;
+        } finally {
+            /*try {
+                highLevelClient.close();
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }*/
+        }
+    }
+
+    private List<AnalyzeModel> getAnalyzeModels(AnalyzeRequest request) throws IOException {
+        AnalyzeResponse response = highLevelClient.indices().analyze(request, RequestOptions.DEFAULT);
+        System.out.println(response.toString());
+        List<AnalyzeModel> modelList = new ArrayList<>();
+        response.getTokens().forEach(lexeme -> {
+            AnalyzeModel model = AnalyzeModel.GenModel(lexeme.getType(),
+                    lexeme.getTerm(),
+                    lexeme.getStartOffset(), lexeme.getEndOffset());
+            modelList.add(model);
+        });
+        return modelList;
+    }
+
     @Override
     public List<AnalyzeResponse> analyzes(String text) {
         String[] arys = text.split(" ");
         List<AnalyzeResponse> responses = new ArrayList<>();
-        for (int i = 0; i < arys.length; i++) {
+      /*  for (int i = 0; i < arys.length; i++) {
             AnalyzeResponse response = analyze(arys[i]);
             if (response != null) responses.add(response);
-        }
+        }*/
         return responses;
     }
 
+    /**
+     * 解析语义
+     * @param text
+     * @return
+     */
     @Override
     public ComparisonResult analyzeJava(String text) {
         try {
@@ -190,9 +224,9 @@ public class AnalyzeServiceImpl implements AnalyzeService {
             IKSegmenter segmenter = new IKSegmenter(reader, true);
 
             System.out.println(text);
-            //ik分词逻辑
-            List<AnalyzeModel> modelList = new ArrayList<>();
-            Lexeme lexeme;
+            //ik分词逻辑--通过elasticsearch的分词功能进行分词,可以配置无用次,自定义分词等等
+            List<AnalyzeModel> modelList = analyze(text);
+            /*Lexeme lexeme;
             while ((lexeme = segmenter.next()) != null) {
                 //System.out.println("  "+lexeme.getLexemeTypeString() + " " + lexeme.getLexemeText()
                 //        +" from:"+lexeme.getBeginPosition()
@@ -202,9 +236,9 @@ public class AnalyzeServiceImpl implements AnalyzeService {
                         lexeme.getLexemeText(),
                         lexeme.getBeginPosition(), lexeme.getEndPosition());
                 modelList.add(model);
-            }
+            }*/
 
-            //分析表达式
+            //分析表达式---对分词后的词进行二次分析,比如同义词转换为转等于,大鱼转大鱼等等
             AnalyzeComparisonResult analyze = findAnalyzeMap(modelList, mapAnalyze);
             AnalyzeComparisonResult symbols = findAnalyzeMap(modelList, mapSymbols);
             if (analyze.getIndex() == -1 || symbols.getIndex() == -1) {
@@ -285,25 +319,40 @@ public class AnalyzeServiceImpl implements AnalyzeService {
         AnalyzeComparisonResult result = new AnalyzeComparisonResult();
         result.setIndex(-1);
 
-        for (int i = 0; i < modelList.size(); i++) {
-            if (map.containsKey(modelList.get(i).getLexemeText())) {
-                AnalyzeModel model = map.get(modelList.get(i).getLexemeText());
-                model = JSON.parseObject(JSON.toJSONString(model), AnalyzeModel.class);
-                model.setLexemeType(modelList.get(i).getLexemeType());
-                model.setLexemeText(modelList.get(i).getLexemeText());
-                model.setBegin(modelList.get(i).getBegin());
-                model.setEnd(modelList.get(i).getEnd());
-
-                result.setIndex(i);
-                result.setModel(model);
-                break;
+        try {
+            for (int i = 0; i < modelList.size(); i++) {
+                //使用elasticsearch的同义词功能
+                String lexemeText = modelList.get(i).getLexemeText();
+                //获取该词的同义词
+                List<AnalyzeModel> synoymList = analyzeSynonym(lexemeText);
+                for (int j = 0; j < synoymList.size(); j++) {
+                    String term = synoymList.get(j).getLexemeText();
+                    if (map.containsKey(term)) {
+                        AnalyzeModel model = new AnalyzeModel();
+                        BeanUtils.copyProperties(model, map.get(synoymList.get(j).getLexemeText()));
+                        model.setLexemeType(synoymList.get(j).getLexemeType());
+                        model.setLexemeText(synoymList.get(j).getLexemeText());
+                        model.setBegin( modelList.get(i).getBegin());
+                        model.setEnd( modelList.get(i).getEnd());
+
+                        result.setIndex(i);
+                        result.setModel(model);
+                        return result;
+                    }
+                }
+                ;
             }
+        } catch (Exception ex) {
+            ex.printStackTrace();
         }
         return result;
     }
 
     @Override
-    public List<ComparisonResult> analyzeJavas(String text) {
+    public List<ComparisonResult> analyzeJavas(List<String> indexCache, List<EsIndexfieldVo> indexFields,String text) {
+        this.indexFields =indexFields;
+        this.indexCache=indexCache;
+
         Dictionary.initial(DefaultConfig.getInstance());
         initKeyWords();
 

+ 30 - 21
src/main/java/com/bowintek/practice/services/impl/EsQueryServiceImpl.java

@@ -3,6 +3,7 @@ package com.bowintek.practice.services.impl;
 
 import com.bowintek.practice.mapper.cquery.EsIndexCquery;
 import com.bowintek.practice.services.service.AnalyzeService;
+import com.bowintek.practice.services.service.EsIndexService;
 import com.bowintek.practice.services.service.EsQueryService;
 import com.bowintek.practice.util.Constant;
 import com.bowintek.practice.util.StringUtils;
@@ -51,6 +52,8 @@ public class EsQueryServiceImpl implements EsQueryService {
     private AnalyzeService analyzeService;
     @Autowired
     private EsIndexCquery esIndexCquery;
+    @Autowired
+    private EsIndexService esIndexService;
 
     private static Object lockObject = new Object();
     private static List<String> indexCache = null;
@@ -63,14 +66,14 @@ public class EsQueryServiceImpl implements EsQueryService {
             //从本地缓存加载数据
             long timeSpan = (new Date()).getTime() - cacheTime;
             if (timeSpan > 30 * 1000 || indexCache == null || pathCache == null) {
-                List<EsIndexVo> list1 = esIndexCquery.getList(null, null, null);
+                List<EsIndexVo> list1 = esIndexService.getAllList();
                 indexCache = list1.stream()
                         .map(m -> m.getIndexCode())
                         .distinct().collect(Collectors.toList());
 
-                List<EsIndexfieldVo> list2 = esIndexCquery.getFieldList(null, null);
+                List<EsIndexfieldVo> list2 = list1.get(0).getFieldList();
 
-                indexFields= list2.stream().filter(p -> !p.getDataType().equals("NESTED")).collect(Collectors.toList());
+                indexFields = list2.stream().filter(p -> !p.getDataType().equals("NESTED")).collect(Collectors.toList());
 
                 pathCache = list2.stream().filter(p -> p.getDataType().equals("NESTED"))
                         .map(m -> m.getFieldCode())
@@ -94,7 +97,7 @@ public class EsQueryServiceImpl implements EsQueryService {
     public List<QueryBuilder> getComparisonQueryList(EsQueryText queryText) {
         List<QueryBuilder> queryList = new ArrayList<>();
         //分析查询字符串,有的字符串需要变成条件查询
-        List<ComparisonResult> cmpList = analyzeService.analyzeJavas(queryText.getKeyString());
+        List<ComparisonResult> cmpList = analyzeService.analyzeJavas(indexCache,indexFields,queryText.getKeyString());
         //二级查询的路径信息
         List<String> pathList = getPathCache();
 
@@ -113,9 +116,11 @@ public class EsQueryServiceImpl implements EsQueryService {
             } else if (StringUtils.IsNullEmpty(queryText.getField())) {//全文查询,没有限制字段
                 //第一级,文字搜索
                 queryList.add(getMultiMatchQuery(cmp.getKeyString()));
-                //第二级,嵌套类型,文字搜索
-                for (String path : pathList) {
-                    queryList.add(getNestedMultiMatchQuery(path, cmp.getKeyString()));
+                if (i == 0) {
+                    //第二级,嵌套类型,文字搜索
+                    for (String path : pathList) {
+                        queryList.add(getNestedMultiMatchQuery(path, cmp.getKeyString(), cmpList));
+                    }
                 }
             } else { //全文查询,限定了字段
                 //第一级,文字搜索
@@ -171,8 +176,8 @@ public class EsQueryServiceImpl implements EsQueryService {
 
             //[4]建立查询参数分析
             //==>要查询的索引列表,从数据库配置表中获取
-            SearchRequest searchRequest=new SearchRequest(getIndexCache().toArray(new String[0])); //新建请求
-            SearchSourceBuilder searchBuilder=new SearchSourceBuilder();
+            SearchRequest searchRequest = new SearchRequest(getIndexCache().toArray(new String[0])); //新建请求
+            SearchSourceBuilder searchBuilder = new SearchSourceBuilder();
 
 
             //==>数据分页显示
@@ -181,12 +186,12 @@ public class EsQueryServiceImpl implements EsQueryService {
             //==>设置查询条件
 
             if (queryMustList.size() > 0) {
-                queryMustList.forEach(x->boolQuery.should(x));
+                queryMustList.forEach(x -> boolQuery.should(x));
             }
 
             //排序
             if (orderType != null && !StringUtils.IsNullEmpty(orderBy)) {
-                searchBuilder.query(boolQuery).sort(orderBy,orderType.equals("asc") ? SortOrder.ASC : SortOrder.DESC);
+                searchBuilder.query(boolQuery).sort(orderBy, orderType.equals("asc") ? SortOrder.ASC : SortOrder.DESC);
             } else {
                 searchBuilder.query(boolQuery);
             }
@@ -199,7 +204,7 @@ public class EsQueryServiceImpl implements EsQueryService {
 
             //查询后分组
 
-           TermsAggregationBuilder aggregation= AggregationBuilders.terms("group_well")
+            TermsAggregationBuilder aggregation = AggregationBuilders.terms("group_well")
                     .field("well_id")
                     .subAggregation(
                             AggregationBuilders.terms("group_well2")
@@ -228,7 +233,7 @@ public class EsQueryServiceImpl implements EsQueryService {
             log.info(ex.getMessage());
             result.put("Message", ex.getMessage());
             result.put("StackTrace", ex.getStackTrace());
-        }finally {
+        } finally {
            /* try {
                 highLevelClient.close();
             } catch (IOException e) {
@@ -255,12 +260,16 @@ public class EsQueryServiceImpl implements EsQueryService {
         return getMultiMatchQuery(Arrays.asList(fields), text);
     }
 
-    public QueryBuilder getNestedMultiMatchQuery(String path, String text) {
+    public QueryBuilder getNestedMultiMatchQuery(String path, String text, List<ComparisonResult> cmpList) {
         //不指定,查询所有的二级字段
         // 创建 nested 查询
+        BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();
+        for (int i = 0; i < cmpList.size(); i++) {
+            boolBuilder.should(getMultiMatchQuery(cmpList.get(i).getKeyString()));
+        }
         NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
                 path,
-                getMultiMatchQuery(text),
+                boolBuilder,
                 ScoreMode.None);
 
         // 设置 inner_hits
@@ -332,16 +341,16 @@ public class EsQueryServiceImpl implements EsQueryService {
         else if (opreation.equals("小于等于"))
             query = QueryBuilders.rangeQuery(fieldString).lte(value);
         else if (opreation.equals("等于")) {
-           //如果是字符串类型,则使用不分词查询
+            //如果是字符串类型,则使用不分词查询
             boolean isVarchar = indexFields.stream().anyMatch(x -> x.getFieldCode().equals(fieldString) && x.getDataType().equals("VARCHAR"));
-            if(isVarchar) {
+            if (isVarchar) {
                 query = QueryBuilders.termQuery(fieldString + ".keyword", value);
-            }else {
+            } else {
                 query = QueryBuilders.termQuery(fieldString, value);
             }
-        }else if (opreation.equals("包括IN")) {
+        } else if (opreation.equals("包括IN")) {
             String[] fls = value.split(",");
-            query=QueryBuilders.termsQuery(fieldString, fls);
+            query = QueryBuilders.termsQuery(fieldString, fls);
         }
         return query;
     }
@@ -361,7 +370,7 @@ public class EsQueryServiceImpl implements EsQueryService {
         for (Terms.Bucket bucket : groupWell.getBuckets()) {
             Map<String, Object> map = new HashMap<>();
             map.put("key", bucket.getKeyAsString());
-            map.put("name",((Terms)bucket.getAggregations().get("group_well2")).getBuckets().get(0).getKeyAsString());
+            map.put("name", ((Terms) bucket.getAggregations().get("group_well2")).getBuckets().get(0).getKeyAsString());
             map.put("doc_count", bucket.getDocCount());
             aggs.add(map);
         }

+ 2 - 2
src/main/java/com/bowintek/practice/services/service/AnalyzeService.java

@@ -2,6 +2,7 @@ package com.bowintek.practice.services.service;
 
 import com.bowintek.practice.model.SrTempData;
 import com.bowintek.practice.vo.Analyze.ComparisonResult;
+import com.bowintek.practice.vo.EsIndexfieldVo;
 import com.bowintek.practice.vo.SaerchtempVo;
 import com.bowintek.practice.vo.temp.TempObjectModel;
 import com.bowintek.practice.vo.temp.TempSaveResult;
@@ -12,8 +13,7 @@ import java.util.HashMap;
 import java.util.List;
 
 public interface AnalyzeService {
-    AnalyzeResponse analyze(String text);
     List<AnalyzeResponse> analyzes(String text);
     ComparisonResult analyzeJava(String text);
-    List<ComparisonResult> analyzeJavas(String text);
+    List<ComparisonResult> analyzeJavas(List<String> indexCache, List<EsIndexfieldVo> indexFields,String text);
 }

+ 1 - 3
target/classes/generatorConfig.xml

@@ -118,8 +118,6 @@
             <columnOverride column="StandardMajorID" javaType="java.lang.Integer" jdbcType="INTEGER" />
             <table schema="" tableName="Sys_Log"><property name="useActualColumnNames" value="true"/></table>
         </table>-->
-        <table schema="" tableName="cf_apply_form"><property name="useActualColumnNames" value="true"/></table>
-        <table schema="" tableName="cf_apply_form_reviewer"><property name="useActualColumnNames" value="true"/></table>
-        <table schema="" tableName="cf_apply_form_well_file"><property name="useActualColumnNames" value="true"/></table>
+        <table schema="" tableName="es_relation_log"><property name="useActualColumnNames" value="true"/></table>
     </context>
 </generatorConfiguration>

+ 1 - 0
vue/src/layout/header/index.vue

@@ -109,6 +109,7 @@ const updatePassword = () => {
 };
 
 const onShowCart = () => {
+  console.log(shoppingCartModalRef.value);
   shoppingCartModalRef.value.show();
 }
 onMounted(() => {

+ 1 - 6
vue/src/views/wellinfo/shoppingcart.vue

@@ -63,11 +63,8 @@ defineOptions({
     Form, Modal, filePreview, Button
   }
 });
-
-const modalFormRef = ref<FormInstance>();
 const visible = ref<boolean>(false);
 const visible2 = ref<boolean>(false);
-const spinning = ref<boolean>(false);
 const docList = ref<any[]>([]);
 const reason = ref();
 
@@ -75,6 +72,7 @@ const show = () => {
   docList.value = [];
   visible.value = true;
   let storeList = localStorage.getItem("applyFileList");
+  console.log("storeList:"+storeList);
   if (storeList != null) {
     docList.value = JSON.parse(storeList);
   }
@@ -95,9 +93,6 @@ const handleOk = () => {
 const onRemove = (index) => {
   docList.value.splice(index, 1);
   localStorage.setItem("applyFileList", JSON.stringify(docList.value));
-}
-const handleCancel = () => {
-
 }
 </script>