elasticsearch 自定义得分

xiaoxiao2025-04-23  14

 /**      * 进行搜索      * @param title      * @return      */     @RequestMapping("searchItems")     @ResponseBody     public Map<String,Object> goSearch(HttpServletRequest request) {         QueryBuilder initQb =null; //        String param=request.getParameter("s");//搜索参数         String param=request.getParameter("keyWordType");//搜索类型         String pageNo=request.getParameter("pageNo");         String pageSize=request.getParameter("pageSize");         //返回的map,进行数据封装         Map<String,Object> msgMap = new HashMap<String,Object>();         //建立bool查询,如果没有组合查询,直接写QueryBuilder         BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();         String search = null;         try {             search=CreateSubjectUtils.getBooleanKw(request);             initQb  = QueryBuilders.queryStringQuery(search)                         .defaultField("FIELD")                         .field("attachment.content",2.0F).field("filename", 2.0F).field("sheets", 2.0F);//.field("filename", 2.0F).field("sheets", 2.0F).defaultOperator(Operator.OR)             System.out.println("-----sssss------"+search);             System.out.println("-----initQb------"+initQb);         } catch (QueryFormatException e1) {             e1.printStackTrace();         }       //先过滤在查询               QueryBuilder fqb = null;           if(StringUtils.isNotBlank(param)) {               fqb = boolBuilder.should(initQb);           }                                //c查询         SearchRequestBuilder searchRequestBuilder=null;         try {             searchRequestBuilder = publicSafetySearchDao.getTransportClient().prepareSearch("index1")                     .setTypes("type1")                     .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) //设置查询类型:1.SearchType.DFS_QUERY_THEN_FETCH 精确查询; 2.SearchType.SCAN 扫描查询,无序                     .setQuery(fqb);                     //.setFrom(0)                     //.setSize(100);         } catch (Exception e) {             e.printStackTrace();         }                  if(StringUtils.isNotEmpty(pageNo) && StringUtils.isNotEmpty(pageSize)){             searchRequestBuilder.setFrom((Integer.valueOf(pageNo) - 1) * Integer.valueOf(pageSize));             searchRequestBuilder.setSize(Integer.valueOf(pageSize));         }                  // 是否自定义得分 //        if (StringUtils.isNotEmpty("factor")) {             QueryBuilder query = QueryBuilders.queryStringQuery(search).defaultField("FIELD").field("sheets", 2.0F);             //QueryBuilder query = QueryBuilders.matchQuery("filename", search);             FilterFunctionBuilder[] functions = {                     new FilterFunctionBuilder(query, ScoreFunctionBuilders.weightFactorFunction(5f)),                     new FunctionScoreQueryBuilder.FilterFunctionBuilder(                             ScoreFunctionBuilders.scriptFunction(new Script("Math.log(2 + doc['attachment.content_length'].value )") ))             };             FunctionScoreQueryBuilder fcqb = QueryBuilders.functionScoreQuery(initQb,functions).scoreMode(ScoreMode.MULTIPLY);              searchRequestBuilder.setQuery(fcqb);                          //自定义得分             /*FilterFunctionBuilder[] functions1 = {                     new FunctionScoreQueryBuilder.FilterFunctionBuilder(                             ScoreFunctionBuilders.scriptFunction(new Script("Math.log(2 + doc['attachment.content_length'].value )")))                 };             FunctionScoreQueryBuilder fcqb1 = QueryBuilders.functionScoreQuery(fqb,functions1).scoreMode(ScoreMode.MULTIPLY);              searchRequestBuilder.setQuery(fcqb1);*/ //        }                  //设置高亮显示         HighlightBuilder highlightBuilder = new HighlightBuilder().field("*").requireFieldMatch(false);         highlightBuilder.preTags("<span style=\"color:#c00\">");         highlightBuilder.postTags("</span>");         searchRequestBuilder.highlighter(highlightBuilder);         System.out.println("-----fqb------"+searchRequestBuilder);         //执行结果         SearchResponse response = searchRequestBuilder.execute().actionGet();         //接受结果         List<Map<String,Object>> result = new ArrayList<>();         //遍历结果         for(SearchHit hit:response.getHits()){             Map<String, Object> source = hit.getSource();             //处理高亮片段             Map<String, HighlightField> highlightFields = hit.getHighlightFields();             HighlightField nameField = highlightFields.get("attachment.content");             if(nameField!=null){                 Text[] fragments = nameField.fragments();                 String nameTmp ="";                 for(Text text:fragments){                     nameTmp+=text;                 }                 //将高亮片段组装到结果中去                 source.put("content",nameTmp);             }             HighlightField filename = highlightFields.get("filename");             if(filename!=null){                 Text[] fragments = filename.fragments();                 String nameTmp ="";                 for(Text text:fragments){                     nameTmp+=text;                 }                 //将高亮片段组装到结果中去                 source.put("filename",nameTmp);             }                           result.add(source);         }         //封装数据返回         msgMap.put("itemsList",result);     //搜索结果         msgMap.put("total",response.getHits().getTotalHits());          //分页总条数         msgMap.put("took",response.getTook().getSecondsFrac()); //获取响应需要的时间         return msgMap;     }

转载请注明原文地址: https://www.6miu.com/read-5028960.html

最新回复(0)