|
@@ -1,11 +1,13 @@
|
|
|
package com.example.nngkxxdp.elk;
|
|
|
|
|
|
import java.io.IOException;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
+import java.util.*;
|
|
|
|
|
|
+import com.example.nngkxxdp.dao.ElkDao;
|
|
|
import org.elasticsearch.action.search.SearchRequest;
|
|
|
+import org.elasticsearch.action.search.SearchRequestBuilder;
|
|
|
+import org.elasticsearch.search.aggregations.bucket.terms.Terms;
|
|
|
+import org.elasticsearch.search.aggregations.bucket.terms.Terms.Bucket;
|
|
|
import org.elasticsearch.action.search.SearchResponse;
|
|
|
import org.elasticsearch.client.RequestOptions;
|
|
|
import org.elasticsearch.client.RestHighLevelClient;
|
|
@@ -14,7 +16,10 @@ import org.elasticsearch.index.query.QueryBuilder;
|
|
|
import org.elasticsearch.index.query.QueryBuilders;
|
|
|
import org.elasticsearch.script.Script;
|
|
|
import org.elasticsearch.search.SearchHit;
|
|
|
+import org.elasticsearch.search.aggregations.*;
|
|
|
+import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
|
|
|
import org.elasticsearch.search.builder.SearchSourceBuilder;
|
|
|
+import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
|
|
|
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
|
|
|
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
|
|
|
import org.elasticsearch.search.sort.ScriptSortBuilder;
|
|
@@ -34,289 +39,548 @@ import com.example.nngkxxdp.util.ConstStr;
|
|
|
import com.example.nngkxxdp.util.SendUtil;
|
|
|
|
|
|
/**
|
|
|
-* @author Mr.wang
|
|
|
-* @version 1.0.0
|
|
|
-* @date 2021年12月10日 下午2:41:31
|
|
|
-* @Description
|
|
|
-*/
|
|
|
+ * @author Mr.wang
|
|
|
+ * @version 1.0.0
|
|
|
+ * @date 2021年12月10日 下午2:41:31
|
|
|
+ * @Description
|
|
|
+ */
|
|
|
@RestController
|
|
|
@RequestMapping("elk")
|
|
|
public class ElkController {
|
|
|
|
|
|
- @Autowired
|
|
|
- private ElkService elkService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private RestHighLevelClient restHighLevelClient;
|
|
|
-
|
|
|
- @Value("${elasticsearch.index}")
|
|
|
- private String elkIndex;
|
|
|
-
|
|
|
- /**
|
|
|
- * 搜索字段
|
|
|
- */
|
|
|
- private String[] query = new String[] {"title", "content"};
|
|
|
-
|
|
|
- /**
|
|
|
- * 部门字段
|
|
|
- */
|
|
|
- private String deptName = "departmentname.keyword";
|
|
|
-
|
|
|
- /**
|
|
|
- * 热门字段
|
|
|
- */
|
|
|
- private String hotArticle = "e_top";
|
|
|
-
|
|
|
- /**
|
|
|
- * 排序字段
|
|
|
- */
|
|
|
- private String publishTime = "sorttime";
|
|
|
-
|
|
|
- /**
|
|
|
- * 关键词搜索
|
|
|
- * @param page
|
|
|
- * @param limit
|
|
|
- * @param content
|
|
|
- * @param dept
|
|
|
- * @return
|
|
|
- * @throws IOException
|
|
|
- */
|
|
|
- @GetMapping("search")
|
|
|
- public Map<String, Object> search(Integer page, Integer limit, String content, String dept) throws IOException {
|
|
|
- if (!Blank.notBlank(page) || !Blank.notBlank(limit)) {
|
|
|
- return SendUtil.send(false, ConstStr.REQUEST_WRONGPARAMS);
|
|
|
- }
|
|
|
- SearchRequest searchRequest = new SearchRequest(elkIndex);
|
|
|
-
|
|
|
-
|
|
|
- // 创建搜索条件
|
|
|
- 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(dept)) {
|
|
|
- // 查询对应部门
|
|
|
- List<String> oldDept = elkService.getDeptName(dept);
|
|
|
- // 搜索部门
|
|
|
- System.err.println(oldDept);
|
|
|
- BoolQueryBuilder boolQueryBuilder2 = new BoolQueryBuilder();
|
|
|
- List<QueryBuilder> should = boolQueryBuilder2.should();
|
|
|
- if (Blank.notBlank(oldDept)) {
|
|
|
- for (String depts : oldDept) {
|
|
|
- if (Blank.notBlank(depts)) {
|
|
|
- should.add(QueryBuilders.matchQuery(deptName, depts));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- should.add(QueryBuilders.matchQuery(deptName, dept));
|
|
|
- list.add(boolQueryBuilder2);
|
|
|
- }
|
|
|
- if (Blank.notBlank(content) || Blank.notBlank(dept)) {
|
|
|
- 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(publishTime, SortOrder.DESC);
|
|
|
- // 开始位置
|
|
|
- searchSourceBuilder.from((page - 1) * limit);
|
|
|
- // 查询条数
|
|
|
- searchSourceBuilder.size(limit);
|
|
|
- searchRequest.source(searchSourceBuilder);
|
|
|
+ @Autowired
|
|
|
+ private ElkService elkService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private RestHighLevelClient restHighLevelClient;
|
|
|
+
|
|
|
+ @Value("${elasticsearch.index}")
|
|
|
+ private String elkIndex;
|
|
|
+ @Value("${elasticsearch.index2}")
|
|
|
+ private String artIndex;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 搜索字段
|
|
|
+ */
|
|
|
+ private String[] query = new String[]{"title", "summary"};
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 部门字段
|
|
|
+ */
|
|
|
+ private String deptName = "departmentname.keyword";
|
|
|
+ private String pubOrg = "puborg.keyword";
|
|
|
+ /**
|
|
|
+ * 文件类型
|
|
|
+ */
|
|
|
+ private String articleType = "artical_type";
|
|
|
+ private String childType = "childtype.keyword";
|
|
|
+ /**
|
|
|
+ * 热门字段
|
|
|
+ */
|
|
|
+ private String hotArticle = "e_top";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 排序字段
|
|
|
+ */
|
|
|
+ private String publishTime = "sorttime";
|
|
|
+ private String pubTimeStr = "pubtimestr.keyword";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 关键词搜索
|
|
|
+ *
|
|
|
+ * @param page
|
|
|
+ * @param limit
|
|
|
+ * @param content
|
|
|
+ * @param dept
|
|
|
+ * @return
|
|
|
+ * @throws IOException
|
|
|
+ */
|
|
|
+ @GetMapping("search")
|
|
|
+ public Map<String, Object> search(Integer page, Integer limit, String content, String dept) throws IOException {
|
|
|
+ if (!Blank.notBlank(page) || !Blank.notBlank(limit)) {
|
|
|
+ return SendUtil.send(false, ConstStr.REQUEST_WRONGPARAMS);
|
|
|
+ }
|
|
|
+ SearchRequest searchRequest = new SearchRequest(elkIndex);
|
|
|
+
|
|
|
+
|
|
|
+ // 创建搜索条件
|
|
|
+ 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(dept)) {
|
|
|
+ // 查询对应部门
|
|
|
+ List<String> oldDept = elkService.getDeptName(dept);
|
|
|
+ // 搜索部门
|
|
|
+ BoolQueryBuilder boolQueryBuilder2 = new BoolQueryBuilder();
|
|
|
+ List<QueryBuilder> should = boolQueryBuilder2.should();
|
|
|
+ if (Blank.notBlank(oldDept)) {
|
|
|
+ for (String depts : oldDept) {
|
|
|
+ if (Blank.notBlank(depts)) {
|
|
|
+ should.add(QueryBuilders.matchQuery(deptName, depts));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ should.add(QueryBuilders.matchQuery(deptName, dept));
|
|
|
+ list.add(boolQueryBuilder2);
|
|
|
+ }
|
|
|
+ if (Blank.notBlank(content) || Blank.notBlank(dept)) {
|
|
|
+ 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]);
|
|
|
+ }
|
|
|
+ hb.numOfFragments(0);
|
|
|
+ searchSourceBuilder.highlighter(hb);
|
|
|
+ }
|
|
|
+ // 排序
|
|
|
+ searchSourceBuilder.sort("_score", SortOrder.DESC);
|
|
|
+ searchSourceBuilder.sort(publishTime, SortOrder.DESC);
|
|
|
+ // 开始位置
|
|
|
+ searchSourceBuilder.from((page - 1) * limit);
|
|
|
+ // 查询条数
|
|
|
+ searchSourceBuilder.size(limit);
|
|
|
+ searchRequest.source(searchSourceBuilder);
|
|
|
// SearchHit[] s = getAllTitle(page, limit, content, dept);
|
|
|
// if (s == null) {
|
|
|
- // 执行搜索
|
|
|
- SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
|
|
|
- SearchHit[] s = searchResponse.getHits().getHits();
|
|
|
+ // 执行搜索
|
|
|
+ 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++) {
|
|
|
+ JSONArray array = new JSONArray();
|
|
|
+ JSONArray highlightArr = new JSONArray();
|
|
|
+ for (int i = 0; i < s.length; i++) {
|
|
|
// System.err.println(s[i]);
|
|
|
- Map<String, HighlightField> hig = s[i].getHighlightFields();
|
|
|
+ Map<String, HighlightField> hig = s[i].getHighlightFields();
|
|
|
// System.err.println(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);
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- public SearchHit[] getAllTitle(Integer page, Integer limit, String content, String dept) throws IOException {
|
|
|
- SearchRequest searchRequest = new SearchRequest(elkIndex);
|
|
|
- // 创建搜索条件
|
|
|
- SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
|
|
|
-
|
|
|
- // 多条件
|
|
|
- BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
|
|
|
-
|
|
|
- List<QueryBuilder> list = boolQueryBuilder.must();
|
|
|
- // 搜索标题和内容
|
|
|
- if (Blank.notBlank(content)) {
|
|
|
- list.add(QueryBuilders.matchQuery(query[0] + ".keyword", content));
|
|
|
- }
|
|
|
- if (Blank.notBlank(dept)) {
|
|
|
- // 查询对应部门
|
|
|
- List<String> oldDept = elkService.getDeptName(dept);
|
|
|
- // 搜索部门
|
|
|
- BoolQueryBuilder boolQueryBuilder2 = new BoolQueryBuilder();
|
|
|
- List<QueryBuilder> should = boolQueryBuilder2.should();
|
|
|
- if (Blank.notBlank(oldDept)) {
|
|
|
- for (String depts : oldDept) {
|
|
|
- should.add(QueryBuilders.matchQuery(deptName, depts));
|
|
|
- }
|
|
|
- } else {
|
|
|
- should.add(QueryBuilders.matchQuery(deptName, dept));
|
|
|
- }
|
|
|
- list.add(boolQueryBuilder2);
|
|
|
- }
|
|
|
- if (Blank.notBlank(content) || Blank.notBlank(dept)) {
|
|
|
- searchSourceBuilder.query(boolQueryBuilder);
|
|
|
- }
|
|
|
- if (Blank.notBlank(content)) {
|
|
|
- // 添加高亮显示
|
|
|
- HighlightBuilder hb = new HighlightBuilder();
|
|
|
- hb.preTags("<span style=\"color:red !important;\">");
|
|
|
- hb.postTags("</span>");
|
|
|
- hb.field(query[0] + ".keyword");
|
|
|
- searchSourceBuilder.highlighter(hb);
|
|
|
- }
|
|
|
- // 排序
|
|
|
- searchSourceBuilder.sort(publishTime, SortOrder.DESC);
|
|
|
- searchSourceBuilder.sort("_score", 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();
|
|
|
- if (s == null || s.length == 0) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- return s;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 搜索热门文章
|
|
|
- * @param page
|
|
|
- * @param limit
|
|
|
- * @return
|
|
|
- * @throws IOException
|
|
|
- */
|
|
|
- @GetMapping("searchHot")
|
|
|
- public Map<String, Object> searchHot(Integer page, Integer limit) throws IOException {
|
|
|
- if (!Blank.notBlank(page) || !Blank.notBlank(limit)) {
|
|
|
- return SendUtil.send(false, ConstStr.REQUEST_WRONGPARAMS);
|
|
|
- }
|
|
|
- SearchRequest searchRequest = new SearchRequest(elkIndex);
|
|
|
-
|
|
|
- // 创建搜索条件
|
|
|
- SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
|
|
|
- // 搜索热门
|
|
|
- searchSourceBuilder.query(QueryBuilders.termQuery(hotArticle, 1));
|
|
|
- // 开始位置
|
|
|
- searchSourceBuilder.from((page - 1) * limit);
|
|
|
- // 查询条数
|
|
|
- searchSourceBuilder.size(limit);
|
|
|
- // 排序
|
|
|
+ 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);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ public SearchHit[] getAllTitle(Integer page, Integer limit, String content, String dept) throws IOException {
|
|
|
+ SearchRequest searchRequest = new SearchRequest(elkIndex);
|
|
|
+ // 创建搜索条件
|
|
|
+ SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
|
|
|
+
|
|
|
+ // 多条件
|
|
|
+ BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
|
|
|
+
|
|
|
+ List<QueryBuilder> list = boolQueryBuilder.must();
|
|
|
+ // 搜索标题和内容
|
|
|
+ if (Blank.notBlank(content)) {
|
|
|
+ list.add(QueryBuilders.matchQuery(query[0] + ".keyword", content));
|
|
|
+ }
|
|
|
+ if (Blank.notBlank(dept)) {
|
|
|
+ // 查询对应部门
|
|
|
+ List<String> oldDept = elkService.getDeptName(dept);
|
|
|
+ // 搜索部门
|
|
|
+ BoolQueryBuilder boolQueryBuilder2 = new BoolQueryBuilder();
|
|
|
+ List<QueryBuilder> should = boolQueryBuilder2.should();
|
|
|
+ if (Blank.notBlank(oldDept)) {
|
|
|
+ for (String depts : oldDept) {
|
|
|
+ should.add(QueryBuilders.matchQuery(deptName, depts));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ should.add(QueryBuilders.matchQuery(deptName, dept));
|
|
|
+ }
|
|
|
+ list.add(boolQueryBuilder2);
|
|
|
+ }
|
|
|
+ if (Blank.notBlank(content) || Blank.notBlank(dept)) {
|
|
|
+ searchSourceBuilder.query(boolQueryBuilder);
|
|
|
+ }
|
|
|
+ if (Blank.notBlank(content)) {
|
|
|
+ // 添加高亮显示
|
|
|
+ HighlightBuilder hb = new HighlightBuilder();
|
|
|
+ hb.preTags("<span style=\"color:red !important;\">");
|
|
|
+ hb.postTags("</span>");
|
|
|
+ hb.field(query[0] + ".keyword");
|
|
|
+ searchSourceBuilder.highlighter(hb);
|
|
|
+ }
|
|
|
+ // 排序
|
|
|
+ searchSourceBuilder.sort(publishTime, SortOrder.DESC);
|
|
|
+ searchSourceBuilder.sort("_score", 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();
|
|
|
+ if (s == null || s.length == 0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return s;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 搜索热门文章
|
|
|
+ *
|
|
|
+ * @param page
|
|
|
+ * @param limit
|
|
|
+ * @return
|
|
|
+ * @throws IOException
|
|
|
+ */
|
|
|
+ @GetMapping("searchHot")
|
|
|
+ public Map<String, Object> searchHot(Integer page, Integer limit) throws IOException {
|
|
|
+ if (!Blank.notBlank(page) || !Blank.notBlank(limit)) {
|
|
|
+ return SendUtil.send(false, ConstStr.REQUEST_WRONGPARAMS);
|
|
|
+ }
|
|
|
+ SearchRequest searchRequest = new SearchRequest(elkIndex);
|
|
|
+
|
|
|
+ // 创建搜索条件
|
|
|
+ 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++) {
|
|
|
+
|
|
|
+ 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++) {
|
|
|
// System.err.println(s[i]);
|
|
|
- array.add(s[i]);
|
|
|
- }
|
|
|
- Map<String, Object> map = new HashMap<>();
|
|
|
- map.put("array", array);
|
|
|
- map.put("count", elkService.getAnswerCount());
|
|
|
- return SendUtil.send(true, null, map);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取所有部门
|
|
|
- * @return
|
|
|
- */
|
|
|
- @GetMapping("deptAll")
|
|
|
- public Map<String, Object> deptAll() {
|
|
|
- return SendUtil.send(true, null, elkService.deptAll());
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 保存提问信息
|
|
|
- * @param phone
|
|
|
- * @param remark
|
|
|
- * @param dept
|
|
|
- * @return
|
|
|
- */
|
|
|
- @PostMapping("saveSub")
|
|
|
- public Map<String, Object> saveSub(String phone, String remark, String dept) {
|
|
|
- if (Blank.isEmpty(phone, remark, dept)) {
|
|
|
+ array.add(s[i]);
|
|
|
+ }
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
+ map.put("array", array);
|
|
|
+ map.put("count", elkService.getAnswerCount());
|
|
|
+ return SendUtil.send(true, null, map);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取所有部门
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @GetMapping("deptAll")
|
|
|
+ public Map<String, Object> deptAll() {
|
|
|
+ return SendUtil.send(true, null, elkService.deptAll());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存提问信息
|
|
|
+ *
|
|
|
+ * @param phone
|
|
|
+ * @param remark
|
|
|
+ * @param dept
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @PostMapping("saveSub")
|
|
|
+ public Map<String, Object> saveSub(String phone, String remark, String dept) {
|
|
|
+ if (Blank.isEmpty(phone, remark, dept)) {
|
|
|
return SendUtil.send(false, ConstStr.REQUEST_WRONGPARAMS);
|
|
|
}
|
|
|
- return SendUtil.send(elkService.saveSub(phone, remark, dept));
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 分页查询提问信息
|
|
|
- * @param page
|
|
|
- * @param limit
|
|
|
- * @param search
|
|
|
- * @param dept
|
|
|
- * @return
|
|
|
- */
|
|
|
- @GetMapping("getPageSub")
|
|
|
- public Map<String, Object> getPageSub(Integer page, Integer limit, String search, String dept, String time) {
|
|
|
- if (Blank.isEmpty(page, limit)) {
|
|
|
+ return SendUtil.send(elkService.saveSub(phone, remark, dept));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分页查询提问信息
|
|
|
+ *
|
|
|
+ * @param page
|
|
|
+ * @param limit
|
|
|
+ * @param search
|
|
|
+ * @param dept
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @GetMapping("getPageSub")
|
|
|
+ public Map<String, Object> getPageSub(Integer page, Integer limit, String search, String dept, String time) {
|
|
|
+ if (Blank.isEmpty(page, limit)) {
|
|
|
+ return SendUtil.send(false, ConstStr.REQUEST_WRONGPARAMS);
|
|
|
+ }
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
+ map.put("page", (page - 1) * limit);
|
|
|
+ map.put("limit", limit);
|
|
|
+ map.put("search", search);
|
|
|
+ map.put("dept", dept);
|
|
|
+ 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);
|
|
|
+ // 排序
|
|
|
+ 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]);
|
|
|
+ }
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
+ map.put("array", array);
|
|
|
+ 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,
|
|
|
+ String orgName, Integer type, String childTypeName) 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(orgName)) {
|
|
|
+ if (!"全部".equals(orgName)) {
|
|
|
+ BoolQueryBuilder boolQueryBuilder2 = new BoolQueryBuilder();
|
|
|
+ List<QueryBuilder> should = boolQueryBuilder2.should();
|
|
|
+ should.add(QueryBuilders.matchQuery(pubOrg, orgName));
|
|
|
+ list.add(boolQueryBuilder2);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (Blank.isEmpty(type)) {
|
|
|
+ type = 0;
|
|
|
+ }
|
|
|
+ BoolQueryBuilder boolQueryBuilder3 = new BoolQueryBuilder();
|
|
|
+ // 默认全部文件 查询所有
|
|
|
+ if (type == 0) {
|
|
|
+ List<QueryBuilder> should1 = boolQueryBuilder3.should();
|
|
|
+ should1.add(QueryBuilders.matchQuery(articleType, 1));
|
|
|
+ should1.add(QueryBuilders.matchQuery(articleType, 2));
|
|
|
+ should1.add(QueryBuilders.matchQuery(articleType, 3));
|
|
|
+ list.add(boolQueryBuilder3);
|
|
|
+ } else {
|
|
|
+ List<QueryBuilder> must = boolQueryBuilder3.must();
|
|
|
+ must.add(QueryBuilders.matchQuery(articleType, type));
|
|
|
+ list.add(boolQueryBuilder3);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 搜索主题分类
|
|
|
+ if (Blank.notBlank(childTypeName)) {
|
|
|
+ String[] childTypeNames = childTypeName.split(",");
|
|
|
+ BoolQueryBuilder boolQueryBuilder4 = new BoolQueryBuilder();
|
|
|
+ List<QueryBuilder> should = boolQueryBuilder4.should();
|
|
|
+ for (String typeName : childTypeNames) {
|
|
|
+ if (typeName.indexOf("\\") != -1) {
|
|
|
+ typeName = typeName.replace("\\", "\\");
|
|
|
+ }
|
|
|
+ should.add(QueryBuilders.matchQuery(childType, typeName));
|
|
|
+ }
|
|
|
+ list.add(boolQueryBuilder4);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (Blank.notBlank(content) || Blank.notBlank(orgName)
|
|
|
+ || Blank.notBlank(type) || Blank.notBlank(childTypeName)) {
|
|
|
+ searchSourceBuilder.query(boolQueryBuilder);
|
|
|
+ }
|
|
|
+// System.out.println(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);
|
|
|
+ }
|
|
|
+ // 分组查询 根据主题类型分类
|
|
|
+ TermsAggregationBuilder aggregation = AggregationBuilders.terms("childtype")
|
|
|
+ //聚合字段名
|
|
|
+ .field("childtype.keyword")
|
|
|
+ .size(300)
|
|
|
+ // 降序
|
|
|
+ .order(BucketOrder.count(false));
|
|
|
+ // 排序
|
|
|
+ searchSourceBuilder.sort("_score", SortOrder.DESC);
|
|
|
+ searchSourceBuilder.sort(pubTimeStr, SortOrder.DESC);
|
|
|
+
|
|
|
+ // 开始位置
|
|
|
+ searchSourceBuilder.from((page - 1) * limit);
|
|
|
+ // 查询条数
|
|
|
+ searchSourceBuilder.size(limit);
|
|
|
+ searchSourceBuilder.aggregation(aggregation);
|
|
|
+ searchRequest.source(searchSourceBuilder);
|
|
|
+// System.out.println(searchSourceBuilder);
|
|
|
+ // 执行搜索
|
|
|
+ SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
|
|
|
+ SearchHit[] s = searchResponse.getHits().getHits();
|
|
|
+ // 查询分组信息
|
|
|
+ Terms terms = searchResponse.getAggregations().get("childtype");
|
|
|
+ List<? extends Bucket> buckets = terms.getBuckets();
|
|
|
+ Map<Object, Object> groupInfo = new HashMap<>();
|
|
|
+ for (Bucket bt : buckets) {
|
|
|
+ groupInfo.put(bt.getKey(), bt.getDocCount());
|
|
|
+// System.err.println(bt.getKey() + " " + bt.getDocCount());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 封装主题分类第一级的总数量
|
|
|
+ List<Map<String, Object>> childType = elkService.getChildType();
|
|
|
+ int count = 0;
|
|
|
+ Map<String, Object> childTypeMap = new HashMap<>();
|
|
|
+ if (Blank.isNotEmpty(childType)) {
|
|
|
+ for (Map<String, Object> childM : childType) {
|
|
|
+ if (Blank.isNotEmpty(childM.get("children"))) {
|
|
|
+ List<Map<String, Object>> childrenList = (List<Map<String, Object>>) childM.get("children");
|
|
|
+ for (int i = 0; i < childrenList.size(); i++) {
|
|
|
+ String scendTitle = (String) childrenList.get(i).get("title");
|
|
|
+ if (Blank.isNotEmpty(groupInfo.get(scendTitle))) {
|
|
|
+ count += (long) groupInfo.get(scendTitle);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ childTypeMap.put((String) childM.get("title"), count);
|
|
|
+ count = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ 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);
|
|
|
+ map.put("groupInfo", groupInfo);
|
|
|
+ map.put("firstCount", childTypeMap);
|
|
|
+ return SendUtil.send(true, null, map);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取所有的发文机关
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @GetMapping("getPubs")
|
|
|
+ public Map<String, Object> getPubs() {
|
|
|
+ return SendUtil.send(true, null, elkService.getPubs());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取第一级主题分类
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @GetMapping("getFirstChildType")
|
|
|
+ public Map<String, Object> getFirstChildType() {
|
|
|
+ return SendUtil.send(true, null, elkService.getFirstChildType());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取第二级主题分类
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @GetMapping("getSecondChildType")
|
|
|
+ public Map<String, Object> getSecondChildType(Integer id) {
|
|
|
+ if (Blank.isEmpty(id)) {
|
|
|
return SendUtil.send(false, ConstStr.REQUEST_WRONGPARAMS);
|
|
|
}
|
|
|
- Map<String, Object> map = new HashMap<>();
|
|
|
- map.put("page", (page - 1) * limit);
|
|
|
- map.put("limit", limit);
|
|
|
- map.put("search", search);
|
|
|
- map.put("dept", dept);
|
|
|
- map.put("time", time);
|
|
|
- return elkService.getPageSub(map);
|
|
|
- }
|
|
|
-
|
|
|
- @GetMapping("getSubDeptAll")
|
|
|
- public Map<String, Object> getSubDeptAll() {
|
|
|
- return SendUtil.send(true, null, elkService.getSubDeptAll());
|
|
|
- }
|
|
|
+ return SendUtil.send(true, null, elkService.getSecondChildType(id));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取主题分类
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @GetMapping("getChildType")
|
|
|
+ public Map<String, Object> getChildType() {
|
|
|
+ return SendUtil.send(true, null, elkService.getChildType());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取主题分类条数
|
|
|
+ */
|
|
|
+ @GetMapping("getChildTypeCount")
|
|
|
+ public Map<String, Object> getChildTypeCount(String typeName) {
|
|
|
+ return SendUtil.send(true, null, elkService.getChildTypeCount(typeName));
|
|
|
+ }
|
|
|
}
|