service代码实现,这里代码主要功能就是调用es的工具类,对博客描述,作者,博客标题,博客内容进行全文检索。
@Override public ResultCode<List<ContentsWithBLOBs>> getContentListFromEs(String searchParam) { ResultCode resultCode = new ResultCode(); // 校验参数,参数不能为空 if (StringUtils.isBlank(searchParam)) { LOGGER.info(">>>>>> params not be null"); resultCode.setMsg(Messages.INPUT_ERROR_MSG); resultCode.setCode(Messages.INPUT_ERROR_CODE); return resultCode; } String matchStr = "blog_desc=" + searchParam; List<Map<String, Object>> result = ElasticsearchUtils.searchListData(BillboardContants.ES_CONTENT_INDEX,BillboardContants.ES_CONTENT_TYPE,BillboardContants.ES_CONTENT_FIELD,true,matchStr); matchStr = "author=" + searchParam; result.addAll(ElasticsearchUtils.searchListData(BillboardContants.ES_CONTENT_INDEX,BillboardContants.ES_CONTENT_TYPE,BillboardContants.ES_CONTENT_FIELD,true,matchStr)); matchStr = "title=" + searchParam; result.addAll(ElasticsearchUtils.searchListData(BillboardContants.ES_CONTENT_INDEX,BillboardContants.ES_CONTENT_TYPE,BillboardContants.ES_CONTENT_FIELD,true,matchStr)); matchStr = "content=" + searchParam; result.addAll(ElasticsearchUtils.searchListData(BillboardContants.ES_CONTENT_INDEX,BillboardContants.ES_CONTENT_TYPE,BillboardContants.ES_CONTENT_FIELD,true,matchStr)); List<ContentsWithBLOBs> data = JSON.parseArray(JSON.toJSONString(result),ContentsWithBLOBs.class); LOGGER.info("es return data : {}",JSON.toJSONString(result)); resultCode.setData(data); return resultCode; }楼主用到的es的工具类代码实现,就是使用es的java客户端对es进行检索。
/** * 使用分词查询 * * @param index 索引名称 * @param type 类型名称,可传入多个type逗号分隔 * @param fields 需要显示的字段,逗号分隔(缺省为全部字段) * @param matchPhrase true 使用,短语精准匹配 * @param matchStr 过滤条件(xxx=111,aaa=222) * @return */ public static List<Map<String, Object>> searchListData(String index, String type, String fields, boolean matchPhrase, String matchStr) { return searchListData(index, type, 0, 0, null, fields, null, matchPhrase, null, matchStr); } /** * 使用分词查询 * * @param index 索引名称 * @param type 类型名称,可传入多个type逗号分隔 * @param startTime 开始时间 * @param endTime 结束时间 * @param size 文档大小限制 * @param fields 需要显示的字段,逗号分隔(缺省为全部字段) * @param sortField 排序字段 * @param matchPhrase true 使用,短语精准匹配 * @param highlightField 高亮字段 * @param matchStr 过滤条件(xxx=111,aaa=222) * @return */ public static List<Map<String, Object>> searchListData(String index, String type, long startTime, long endTime, Integer size, String fields, String sortField, boolean matchPhrase, String highlightField, String matchStr) { SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index); if (StringUtils.isNotEmpty(type)) { searchRequestBuilder.setTypes(type.split(",")); } BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); if (startTime > 0 && endTime > 0) { boolQuery.must(QueryBuilders.rangeQuery("processTime") .format("epoch_millis") .from(startTime) .to(endTime) .includeLower(true) .includeUpper(true)); } //搜索的的字段 if (StringUtils.isNotEmpty(matchStr)) { for (String s : matchStr.split(",")) { String[] ss = s.split("="); if (ss.length > 1) { if (matchPhrase == Boolean.TRUE) { boolQuery.must(QueryBuilders.matchPhraseQuery(s.split("=")[0], s.split("=")[1])); } else { boolQuery.must(QueryBuilders.matchQuery(s.split("=")[0], s.split("=")[1])); } } } } // 高亮(xxx=111,aaa=222) if (StringUtils.isNotEmpty(highlightField)) { HighlightBuilder highlightBuilder = new HighlightBuilder(); //highlightBuilder.preTags("<span >");//设置前缀 //highlightBuilder.postTags("</span>");//设置后缀 // 设置高亮字段 highlightBuilder.field(highlightField); searchRequestBuilder.highlighter(highlightBuilder); } searchRequestBuilder.setQuery(boolQuery); if (StringUtils.isNotEmpty(fields)) { searchRequestBuilder.setFetchSource(fields.split(","), null); } searchRequestBuilder.setFetchSource(true); if (StringUtils.isNotEmpty(sortField)) { searchRequestBuilder.addSort(sortField, SortOrder.DESC); } if (size != null && size > 0) { searchRequestBuilder.setSize(size); } //打印的内容 可以在 Elasticsearch head 和 Kibana 上执行查询 LOGGER.info("\n{}", searchRequestBuilder); SearchResponse searchResponse = searchRequestBuilder.execute().actionGet(); long totalHits = searchResponse.getHits().totalHits; long length = searchResponse.getHits().getHits().length; LOGGER.info("共查询到[{}]条数据,处理数据条数[{}]", totalHits, length); if (searchResponse.status().getStatus() == 200) { // 解析对象 return setSearchResponse(searchResponse, highlightField); } return null; }最后,楼主使用postman测试web服务,如下图所示:
过程中遇到的坑 IK分词器的设置