Browse Source

文件库热门文件+全文搜索

yp 3 years ago
parent
commit
839def74dc
1 changed files with 122 additions and 9 deletions
  1. 122 9
      nngkxxdp/src/main/java/com/example/nngkxxdp/elk/ElkController.java

+ 122 - 9
nngkxxdp/src/main/java/com/example/nngkxxdp/elk/ElkController.java

@@ -51,6 +51,8 @@ public class ElkController {
 
 	@Value("${elasticsearch.index}")
 	private String elkIndex;
+	@Value("${elasticsearch.index2}")
+	private String artIndex;
 
 	/**
 	 * 搜索字段
@@ -66,11 +68,12 @@ public class ElkController {
 	 * 热门字段
 	 */
 	private String hotArticle = "e_top";
-	
+
 	/**
 	 * 排序字段
 	 */
 	private String publishTime = "sorttime";
+	private String pubTimeStr = "pubtimestr.keyword";
 
 	/**
 	 * 关键词搜索
@@ -87,8 +90,8 @@ public class ElkController {
 			return SendUtil.send(false, ConstStr.REQUEST_WRONGPARAMS);
 		}
 		SearchRequest searchRequest = new SearchRequest(elkIndex);
-		
-		
+
+
 		// 创建搜索条件
 		SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
 
@@ -168,7 +171,7 @@ public class ElkController {
 		return SendUtil.send(true, null, map);
 
 	}
-	
+
 	public SearchHit[] getAllTitle(Integer page, Integer limit, String content, String dept) throws IOException {
 		SearchRequest searchRequest = new SearchRequest(elkIndex);
 		// 创建搜索条件
@@ -249,11 +252,11 @@ public class ElkController {
 		searchSourceBuilder.size(limit);
 		// 排序
 //		searchSourceBuilder.sort("dataid", SortOrder.ASC);
-		
+
 		Script script = new Script("Math.random()");
 	    ScriptSortBuilder sortBuilder = new ScriptSortBuilder(script, ScriptSortBuilder.ScriptSortType.NUMBER);
 	    searchSourceBuilder.sort(sortBuilder);
-	    
+
 		searchRequest.source(searchSourceBuilder);
 		// 执行搜索
 		SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
@@ -277,7 +280,7 @@ public class ElkController {
 	public Map<String, Object> deptAll() {
 		return SendUtil.send(true, null, elkService.deptAll());
 	}
-	
+
 	/**
 	 * 保存提问信息
 	 * @param phone
@@ -292,7 +295,7 @@ public class ElkController {
         }
 		return SendUtil.send(elkService.saveSub(phone, remark, dept));
 	}
-	
+
 	/**
 	 * 分页查询提问信息
 	 * @param page
@@ -314,9 +317,119 @@ public class ElkController {
 		map.put("time", time);
 		return elkService.getPageSub(map);
 	}
-	
+
 	@GetMapping("getSubDeptAll")
 	public Map<String, Object> getSubDeptAll() {
 		return SendUtil.send(true, null, elkService.getSubDeptAll());
 	}
+
+	/**
+	 * 搜索热门文件库
+	 * @param page
+	 * @param limit
+	 * @return
+	 * @throws IOException
+	 */
+	@GetMapping("searchHotArticle")
+	public Map<String, Object> searchHotArticle(Integer page, Integer limit) throws IOException {
+		if (!Blank.notBlank(page) || !Blank.notBlank(limit)) {
+			return SendUtil.send(false, ConstStr.REQUEST_WRONGPARAMS);
+		}
+		SearchRequest searchRequest = new SearchRequest(artIndex);
+		// 创建搜索条件
+		SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
+		// 搜索热门
+		searchSourceBuilder.query(QueryBuilders.termQuery(hotArticle, 1));
+		// 开始位置
+		searchSourceBuilder.from((page - 1) * limit);
+		// 查询条数
+		searchSourceBuilder.size(limit);
+		// 排序
+//		searchSourceBuilder.sort("dataid", SortOrder.ASC);
+		Script script = new Script("Math.random()");
+		ScriptSortBuilder sortBuilder = new ScriptSortBuilder(script, ScriptSortBuilder.ScriptSortType.NUMBER);
+		searchSourceBuilder.sort(sortBuilder);
+		searchRequest.source(searchSourceBuilder);
+		// 执行搜索
+		SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
+		SearchHit[] s = searchResponse.getHits().getHits();
+		JSONArray array = new JSONArray();
+		for (int i = 0; i < s.length; i++) {
+			array.add(s[i]);
+		}
+		System.out.println(array.size());
+		Map<String, Object> map = new HashMap<>();
+		map.put("array", array);
+//		map.put("count", elkService.getAnswerCount());
+		return SendUtil.send(true, null, map);
+	}
+
+	/**
+	 * 全文检索
+	 * @param page
+	 * @param limit
+	 * @param content
+	 * @return
+	 * @throws IOException
+	 */
+	@GetMapping("retrieval")
+	public Map<String, Object> retrieval(Integer page, Integer limit, String content) throws IOException {
+		if (!Blank.notBlank(page) || !Blank.notBlank(limit)) {
+			return SendUtil.send(false, ConstStr.REQUEST_WRONGPARAMS);
+		}
+		SearchRequest searchRequest = new SearchRequest(artIndex);
+		// 创建搜索条件
+		SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
+		// 多条件
+		BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
+		List<QueryBuilder> list = boolQueryBuilder.must();
+		// 搜索标题和内容
+		if (Blank.notBlank(content)) {
+			Map<String, Float> fields = new HashMap<>(2);
+			fields.put(query[0], 5.0f);
+			fields.put(query[1], 1.0f);
+			list.add(QueryBuilders.multiMatchQuery(content, query).fields(fields));
+		}
+		if (Blank.notBlank(content)) {
+			searchSourceBuilder.query(boolQueryBuilder);
+		}
+		if (Blank.notBlank(content)) {
+			// 添加高亮显示
+			HighlightBuilder hb = new HighlightBuilder();
+			hb.preTags("<span style=\"color:red !important;\">");
+			hb.postTags("</span>");
+			for (int i = 0; i < query.length; i++) {
+				hb.field(query[i]);
+			}
+			searchSourceBuilder.highlighter(hb);
+		}
+		// 排序
+		searchSourceBuilder.sort("_score", SortOrder.DESC);
+		searchSourceBuilder.sort(pubTimeStr, SortOrder.DESC);
+		// 开始位置
+		searchSourceBuilder.from((page - 1) * limit);
+		// 查询条数
+		searchSourceBuilder.size(limit);
+		searchRequest.source(searchSourceBuilder);
+		// 执行搜索
+		SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
+		SearchHit[] s = searchResponse.getHits().getHits();
+		JSONArray array = new JSONArray();
+		JSONArray highlightArr = new JSONArray();
+		for (int i = 0; i < s.length; i++) {
+			Map<String, HighlightField> hig = s[i].getHighlightFields();
+			JSONObject jsonObject = JSONObject.parseObject(s[i].toString());
+			JSONObject obj = jsonObject.getJSONObject("_source");
+			String str = JSONObject.toJSONString(obj);
+			highlightArr.add(JSONObject.parse(str));
+			for (String key : hig.keySet()){
+				jsonObject.getJSONObject("_source").put(key, hig.get(key).getFragments()[0].toString());
+			}
+			array.add(jsonObject);
+		}
+		Map<String, Object> map = new HashMap<>();
+		map.put("data", array);
+		map.put("highlightArr", highlightArr);
+		return SendUtil.send(true, null, map);
+	}
 }