Skip to content

Commit 9404fb7

Browse files
committed
更新 ES 实战代码。
1 parent 17562bc commit 9404fb7

File tree

7 files changed

+70
-19
lines changed

7 files changed

+70
-19
lines changed

passjava-gateway/src/main/resources/application.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,13 @@ spring:
1313
uri: lb://passjava-question # 负载均衡,将请求转发到注册中心注册的assjava-question服务
1414
predicates: # 断言
1515
- Path=/api/question/** # 如果前端请求路径包含 api/question,则应用这条路由规则
16+
filters: #过滤器
17+
- RewritePath=/api/(?<segment>.*),/$\{segment} # 将跳转路径中包含的 api 替换成空
18+
19+
- id: route_search # 题目微服务路由规则
20+
uri: lb://passjava-search # 负载均衡,将请求转发到注册中心注册的 passjava-search 服务
21+
predicates: # 断言
22+
- Path=/api/search/** # 如果前端请求路径包含 api/question,则应用这条路由规则
1623
filters: #过滤器
1724
- RewritePath=/api/(?<segment>.*),/$\{segment} # 将跳转路径中包含的api替换成空
1825

passjava-search/src/main/java/com/jackson0714/passjava/search/config/EsConstant.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@
99
public class EsConstant {
1010

1111
public static final String QUESTION_INDEX = "question"; // 题目数据在 ES 中的索引
12+
public static final Integer PAGE_SIZE = 5; // 分页大小
1213
}

passjava-search/src/main/java/com/jackson0714/passjava/search/controller/SearchController.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.jackson0714.passjava.search.service.IQuestionSearchService;
44
import com.jackson0714.passjava.search.vo.SearchParam;
5+
import com.jackson0714.passjava.search.vo.SearchQuestionResponse;
56
import org.elasticsearch.action.search.SearchResponse;
67
import org.springframework.beans.factory.annotation.Autowired;
78
import org.springframework.stereotype.Controller;
@@ -23,7 +24,7 @@ public class SearchController {
2324
IQuestionSearchService questionSearchService;
2425

2526
@PostMapping("/question/list")
26-
public SearchResponse list(SearchParam param) {
27+
public SearchQuestionResponse list(SearchParam param) {
2728

2829
return questionSearchService.search(param);
2930

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.jackson0714.passjava.search.service;
22

33
import com.jackson0714.passjava.search.vo.SearchParam;
4-
import org.elasticsearch.action.search.SearchResponse;
4+
import com.jackson0714.passjava.search.vo.SearchQuestionResponse;
55

66
/**
77
* @Author: 公众号 | 悟空聊架构
@@ -11,5 +11,5 @@
1111
*/
1212
public interface IQuestionSearchService {
1313

14-
SearchResponse search(SearchParam param);
14+
SearchQuestionResponse search(SearchParam param);
1515
}

passjava-search/src/main/java/com/jackson0714/passjava/search/service/impl/QuestionSearchServiceImpl.java

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.jackson0714.passjava.search.config.EsConstant;
66
import com.jackson0714.passjava.search.service.IQuestionSearchService;
77
import com.jackson0714.passjava.search.vo.SearchParam;
8+
import com.jackson0714.passjava.search.vo.SearchQuestionResponse;
89
import org.apache.commons.lang.StringUtils;
910
import org.elasticsearch.action.search.SearchRequest;
1011
import org.elasticsearch.action.search.SearchResponse;
@@ -21,6 +22,8 @@
2122
import org.springframework.stereotype.Service;
2223

2324
import java.io.IOException;
25+
import java.util.ArrayList;
26+
import java.util.List;
2427

2528
/**
2629
* @Author: 公众号 | 悟空聊架构
@@ -38,48 +41,67 @@ public class QuestionSearchServiceImpl implements IQuestionSearchService {
3841
private RestHighLevelClient client;
3942

4043
@Override
41-
public SearchResponse search(SearchParam param) {
44+
public SearchQuestionResponse search(SearchParam param) {
4245

43-
SearchResponse response = null;
46+
SearchQuestionResponse questionResponse = new SearchQuestionResponse();
47+
SearchResponse searchResponse = null;
4448
/*
45-
* 动态构建出查询需要的 DSL 语句
49+
* 1.动态构建出查询需要的 DSL 语句
4650
*/
47-
// 1. 创建检索请求
48-
51+
// 1.1) 创建检索请求
4952
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // 构建 DSL 语句
5053
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
5154
if (!StringUtils.isEmpty(param.getKeyword())) {
52-
boolQuery.must(QueryBuilders.matchQuery("title", param.getKeyword()));
55+
// 1.2) title,answer,typeName 字段用来关键词检索
56+
boolQuery.must(QueryBuilders.multiMatchQuery(param.getKeyword(),"title", "answer", "typeName"));
5357
}
54-
5558
if (param.getId() != null) {
59+
// 1.3)题目 id 用来精确匹配
5660
boolQuery.filter(QueryBuilders.termQuery("id", param.getId()));
5761
}
5862
sourceBuilder.query(boolQuery);
63+
64+
// 1.4)分页
65+
sourceBuilder.from((param.getPageNum() - 1) * EsConstant.PAGE_SIZE);
66+
sourceBuilder.size(EsConstant.PAGE_SIZE);
67+
5968
SearchRequest request = new SearchRequest(new String[] {EsConstant.QUESTION_INDEX}, sourceBuilder);
6069

6170
try {
6271
// 2、执行检索
63-
response = client.search(request, RequestOptions.DEFAULT);
72+
searchResponse = client.search(request, RequestOptions.DEFAULT);
6473

6574
// 3、分析结果
66-
System.out.println(response.toString());
75+
System.out.println(searchResponse.toString());
6776
// 3.1)获取查到的数据。
68-
SearchHits hits = response.getHits();
77+
SearchHits hits = searchResponse.getHits();
6978
// 3.2)获取真正命中的结果
7079
SearchHit[] searchHits = hits.getHits();
7180
// 3.3)遍历命中结果
72-
for (SearchHit hit: searchHits) {
73-
String hitStr = hit.getSourceAsString();
74-
QuestionEsModel questionEsModel = JSON.parseObject(hitStr, QuestionEsModel.class);
75-
System.out.println(questionEsModel);
81+
List<QuestionEsModel> questionEsModelList = new ArrayList<>();
82+
if (hits.getHits() != null && hits.getHits().length > 0) {
83+
for (SearchHit hit : searchHits) {
84+
String hitStr = hit.getSourceAsString();
85+
QuestionEsModel questionEsModel = JSON.parseObject(hitStr, QuestionEsModel.class);
86+
System.out.println(questionEsModel);
87+
questionEsModelList.add(questionEsModel);
88+
}
89+
questionResponse.setQuestionList(questionEsModelList);
90+
91+
// 分页
92+
long total = hits.getTotalHits().value;
93+
questionResponse.setTotal(total);
94+
questionResponse.setPageNum(param.getPageNum());
95+
int totalPages = (int) total % EsConstant.PAGE_SIZE == 0 ? (int) total / EsConstant.PAGE_SIZE : (int) (total / EsConstant.PAGE_SIZE + 1);
96+
questionResponse.setTotalPages(totalPages);
7697
}
98+
7799
} catch (IOException e) {
78100
e.printStackTrace();
79101
}
80102

81103

82-
return response;
104+
return questionResponse;
83105
}
84106

85107

passjava-search/src/main/java/com/jackson0714/passjava/search/vo/SearchParam.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@
1212
public class SearchParam {
1313
private String keyword; // 全文匹配的关键字
1414
private String id; // 题目 id
15-
15+
private Integer pageNum; // 题目 id
1616
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.jackson0714.passjava.search.vo;
2+
3+
import com.jackson0714.common.to.es.QuestionEsModel;
4+
import lombok.Data;
5+
6+
import java.util.List;
7+
8+
/**
9+
* @Author: 公众号 | 悟空聊架构
10+
* @Date: 2021/4/7 16:50
11+
* @Site: www.passjava.cn
12+
* @Github: https://github.com/Jackson0714/PassJava-Platform
13+
*/
14+
@Data
15+
public class SearchQuestionResponse {
16+
private List<QuestionEsModel> questionList;
17+
private Integer pageNum;
18+
private Long total;
19+
private Integer totalPages;
20+
}

0 commit comments

Comments
 (0)