/** * 进行搜索 * @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; }