说明:
1 该文档仅供参考,时间有限,日后如有深入理解, 会更新
2 操作es ,了解过的有以下几种,
2.1 TransportClient客户端 :官方已经明确表示在ES 7.0版本中将弃用TransportClient
客户端,且在8.0版本中完全移除它,不推荐使用,没使用过
2.2 spring-boot-starter-data-elasticsearch:与springboot集成的jar包,第一次使用过,但更新比较慢,目前版本才2.1,由于集成springboot 、elasticsearch 所以容易引起与es的冲突(es版本敏感) 也会与springboot冲突,我使用时总是连不上es,果断放弃
2.3 spring-data-elasticsearch: 与上一jar包类似
2.4 RestClient: 基于HTTP的客户端REST Client(推荐使用),官方给出来的REST Client有Java Low Level REST Client和Java Hight Level REST Client两个,前者兼容所有版本的ES,后者是基于前者开发出来的,只暴露了部分API,待完善。这个案例中使用Java Low Level REST Client,有如下的一些特点:(本人使用该api)
- 最小化依赖;
- 提供跨所有可用节点的负载平衡;
- 提供节点故障和特定响应代码时的故障转移;
- 提供失败重连的惩罚机制(是否对一个连接失败的节点尝试重连,取决于它连续失败的次数,尝试重连且失败的次数越多,客户端在再次尝试重连这个节点时等的时间就越长。说那么多,太复杂了,其实给一个场景就是:我找你玩儿,你不答应,我伤自尊了,下次去找你我隔了一个星期再去找你,你又不答应,我又伤自尊了,下次再找你的话,那我就隔两个星期,依次类推);
- 持久连接;
- 跟踪请求和响应的日志记录;
- 可选的集群节点自动发现功能;
引用:https://blog.csdn.net/jacksonary/article/details/82729556
3 版本
elasticsearch:2.3.0 ;
springboot: 2.1.1.RELEASE
elasticsearch-rest-high-level-client: 6.0.0
源码
pom.xml 依赖
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.0.0</version>
</dependency>
配置类:
import com.ruoyi.common.utils.StringUtils;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Arrays;
import java.util.Objects;
@Configuration
public class ElasticsearchRestClient {
private static final int ADDRESS_LENGTH = 2;
private static final String HTTP_SCHEME = "http";
/**
* 使用冒号隔开ip和端口1
*/
@Value("${elasticsearch.ip}")
String[] ipAddress;
@Bean
public RestClientBuilder restClientBuilder() {
HttpHost[] hosts = Arrays.stream(ipAddress)
.map(this::makeHttpHost)
.filter(Objects::nonNull)
.toArray(HttpHost[]::new);
return RestClient.builder(hosts);
}
@Bean(name = "highLevelClient")
public RestHighLevelClient highLevelClient(@Autowired RestClientBuilder restClientBuilder) {
restClientBuilder.setMaxRetryTimeoutMillis(60000);
//TODO 此处可以进行其它操作
return new RestHighLevelClient(restClientBuilder);
}
private HttpHost makeHttpHost(String s) {
assert StringUtils.isNotEmpty(s);
String[] address = s.split(":");
if (address.length == ADDRESS_LENGTH) {
String ip = address[0];
int port = Integer.parseInt(address[1]);
return new HttpHost(ip, port, HTTP_SCHEME);
} else {
return null;
}
}
}
配置文件:(注意:此处应该是9200, es 9300是基于TCP的,9200是基于http的)
elasticsearch:
ip: 192.168.0.1:9200
代码
@Autowired
RestHighLevelClient highLevelClient; //注入的类
SearchRequest searchRequest = new SearchRequest(index);//index 是es的索引
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//分页
searchSourceBuilder.from((pageNumber - 1) * pageSize));//pageNumber:当前页 pageSize:查询条数
searchSourceBuilder.size(pageSize);
//按时间排序
searchSourceBuilder.sort("time", SortOrder.DESC);//time 是时间字段
//fetchSource 控制显示的字段, 源码:fetchSource(@Nullable String[] includes, @Nullable String[] excludes) ,第二个值代表排除字段
searchSourceBuilder.fetchSource(new String[]{"message", "path"}, new String[]{});//message path 此处是我要显示的字段
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//条件查询
if (StringUtils.isNotBlank(abc)) { // abc 参数
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("message", abc); //查询message字段等于abc的数据
boolQueryBuilder.must(termQueryBuilder);
}
//时间查询
if (StringUtils.isNotBlank(starttime) && StringUtils.isNotBlank(endtime)) {//starttime开始时间 endtime 结束时间
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("time");//time 是要按时间查询的字段
rangeQueryBuilder.gte(starttime);
rangeQueryBuilder.lte(endtime);
boolQueryBuilder.must(rangeQueryBuilder);
}
searchSourceBuilder.query(boolQueryBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = highLevelClient.search(searchRequest);
long totalHits = searchResponse.getHits().getTotalHits();//totalHits 命中数
SearchHit[] hits = searchResponse.getHits().getHits();//hits 查询出的数据集合
Arrays.stream(hits)
.forEach(i -> {
Map<String, Object> sourceAsMap = i.getSourceAsMap();
//TODO 此处可以操作每条数据
});
资料:
RestClient+SearchSourceBuilder使用案例
SpringBoot整合Elasticsearch(基于RestClient)
基于transport 客户端 的API 操作(基于TransportClient)
spring-data-elasticsearch 源码及API文档
springboot elasticsearch 集成注意事项(基于sprinboot-data-elasticsearch)