ES API

1.maven引入ElasticSearch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.8.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.8.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.8.0</version>
</dependency>

2.设置ES config

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Configuration
public class ElasticSearchConfig {
@Bean
public RestHighLevelClient restHighLevelClient() {
HttpHost[] httpHosts = null;
List<String> hostStrList = getHosts();// getHosts???????????
if (hostStrList.size > 0) {
httpHosts = new HttpHost[hostStrList.size()];
for (int i = 0; i < hostStrList.size(); i++) {
String[] s = hostStrList.get(i).split(":");
String ip = s[0].trim();
int port = Integer.valueOf(s[1].trim());
httpHosts[i] = new HttpHost(ip, port, "http");
}
}
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(httpHosts));
return client;
}
}

3.查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 设置查询的索引库
SearchRequest searchRequest = new SearchRequest("search_index");

// 设置查询器
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();

// 拼接查询条件, filter近似于must,但效率比must高,拼接条件=and
// should近似于or操作
// mustnot为!=
// termQuery为精确查找
boolBuilder.filter(QueryBuilders.termQuery("id",queryVo.getId()));
// matchQuery为模糊查询,会匹配带有相关的结果
boolBuilder.filter(QueryBuilders.matchQuery("name", queryVo.getName()));
// termsQuery近似于in,后面放数组即可
boolBuilder.filter(QueryBuilders.termsQuery("status",queryVo.getStatus().split(",") ));
// 分页,从第10笔资料开始,取20笔
searchSourceBuilder.from(10).size(20);
// 排序
searchSourceBuilder.sort("create_time", SortOrder.DESC);

searchRequest.source(searchSourceBuilder);
// 查询返回的结果集
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

SearchHits hits = searchResponse.getHits();
// 查询的具体结果
SearchHit[] searchHits = hits.getHits();
int total = searchHits.length;

4.滚动查询,统计总条数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
SearchRequest searchRequest = new SearchRequest("索引库");

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();

// 滚动查询
final Scroll scroll = new Scroll(TimeValue.timeValueMinutes(1L));
searchRequest.scroll(scroll);

// 条件查询
packageParamer(boolBuilder, queryVo);
searchSourceBuilder.query(boolBuilder);
// 设置每次最多查多少笔
searchSourceBuilder.size(5000);
// 排序
searchSourceBuilder.sort("ORDER_CREATE_TIME", SortOrder.DESC);
searchRequest.source(searchSourceBuilder);

SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
SearchHit[] searchHits = hits.getHits();
int page = 1;
int total = searchHits.length;
// 若数据处于小于5000,则封装
int queryStart = (queryVo.getPage() -1 ) * queryVo.getSize();
if( queryStart <= 5000) {
for(int i = 0; i < queryVo.getSize() && queryStart+i < searchHits.length; i++) {
String json = JSON.toJSONString(searchHits[queryStart+i].getSourceAsMap(), SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty);
ResultVo vo = JSON.parseObject(json, ResultVo.class);
items.add(handleResultVo(vo));
}
}

//遍历搜索命中的数据,直到没有数据
String scrollId = searchResponse.getScrollId();
while (searchHits != null && searchHits.length > 0) {
SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
scrollRequest.scroll(scroll);
searchResponse = restHighLevelClient.scroll(scrollRequest, RequestOptions.DEFAULT);
scrollId = searchResponse.getScrollId();
searchHits = searchResponse.getHits().getHits();

if (searchHits != null && searchHits.length > 0) {
page++;
total = (page-1) * 5000 + searchHits.length;
boolean flag = queryStart >= (page-1)*5000 && queryStart < page * 5000;

if (flag) {
for(int i = 0; i < queryVo.getSize() && total - queryStart - i > 0; i++) {
String json = JSON.toJSONString(searchHits[queryStart+i-(page-1)*5000].getSourceAsMap(), SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty);
ResultVo vo = JSON.parseObject(json, ResultVo.class);
items.add(handleResultVo(vo));
}
}
}
}

// 清除滚屏
ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
clearScrollRequest.addScrollId(scrollId);//也可以选择setScrollIds()将多个scrollId一起使用
ClearScrollResponse clearScrollResponse = restHighLevelClient.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
clearScrollResponse.isSucceeded();