開發(fā)時遇到需要連接多個ES的需求,類似于連接多個MySQL數(shù)據(jù)庫一樣。
Elasticsearch Java API有四類client連接方式
- TransportClient
- RestClient
- Jest
- Spring Data Elasticsearch
????????其中TransportClient和RestClient是Elasticsearch原生的api。TransportClient可以支持2.x,5.x版本,TransportClient將會在Elasticsearch 7.0棄用并在8.0中完成刪除,因此不推薦后續(xù)使用;而Jest由于是社區(qū)維護,所以更新有一定延遲,目前最新版對接ES6.3.1,近一個月只有四個issue,說明整體活躍度較低,因此也不推薦使用;Spring Data Elasticsearch主要是與Spring生態(tài)對接,可以在web系統(tǒng)中整合到Spring中使用。目前比較推薦使用官方的高階、低階Rest Client,官方維護,比較值得信賴。
項目中使用后Transport Client連接ES,Transport Client是Elasticsearch原生的api,TransportClient可以支持2.x,5.x版本,TransportClient將會在Elasticsearch 7.0棄用并在8.0中完成刪除,因此高版本不推薦此方式。
使用 Spring 注入Bean形式來獲取多個bean實例,代碼如下。
package cn.org.config;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Scope;
import java.net.InetAddress;
import java.net.UnknownHostException;
@Slf4j
@Configuration
public class EsConfig {
@Value("${elasticsearch.cluster-nodes.es1}")
private String es1ClusterNodes;
@Value("${elasticsearch.cluster-nodes.es2}")
private String es2ClusterNodes;
@Bean(name = "es1ElasticsearchClient")
@Primary
@Scope("singleton")
public TransportClient newElasticsearchClient() {
return clientInit(es1ClusterNodes);
}
@Bean(name = "es2ElasticsearchClient")
@Scope("singleton")
public TransportClient archiveElasticsearchClient() {
return clientInit(es2ClusterNodes);
}
public TransportClient clientInit(String clusterNodes) {
Settings settings = Settings.builder()
.put("cluster.name", "es_cluster")
.put("client.transport.sniff", true)
.build();
TransportClient transportClient = null;
try {
transportClient = new PreBuiltTransportClient(settings);
String[] allEsIpPort = clusterNodes.split(",");
String esAddress = allEsIpPort[0];
String InetSocket[] = esAddress.split(":");
String address = InetSocket[0];
Integer port = Integer.valueOf(InetSocket[1]);
transportClient.addTransportAddress(
new InetSocketTransportAddress(InetAddress.getByName(address), port));
} catch (UnknownHostException e) {
log.error("初始化ES錯誤:", e);
}
return transportClient;
}
}
?使用時,直接注入多個bean實例進行查詢即可。
package cn.org.biz;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
@Service
@Slf4j
public class EsService {
@Qualifier("es1ElasticsearchClient")
@Autowired
private TransportClient es1ElasticsearchClient;
@Qualifier("es2ElasticsearchClient")
@Autowired
private TransportClient es2ElasticsearchClient;
public List<MsgBean> doQueryMsgFromEs1(String userName, String type) {
List<MsgBean> list = new ArrayList<>();
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.must(QueryBuilders.matchQuery("userName", userName));
sourceBuilder.query(queryBuilder);
SearchRequestBuilder builder = es1ElasticsearchClient.prepareSearch(type + "-*");
SearchResponse searchResponse = builder.setQuery(sourceBuilder.query()).get();
if (searchResponse.getHits().getTotalHits() > 0) {
for (SearchHit searchHit : searchResponse.getHits()) {
MsgBean msgBean = JSON.parseObject(searchHit.getSourceAsString(), MsgBean.class);
list.add(msgBean);
}
}
return list;
}
public List<MsgBean> doQueryMsgFromEs2(String userName, String certType) {
List<MsgBean> list = new ArrayList<>();
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.must(QueryBuilders.matchQuery("userName", userName));
sourceBuilder.query(queryBuilder);
SearchRequestBuilder builder = es2ElasticsearchClient.prepareSearch(type + "-*");
SearchResponse searchResponse = builder.setQuery(sourceBuilder.query()).get();
if (searchResponse.getHits().getTotalHits() > 0) {
for (SearchHit searchHit : searchResponse.getHits()) {
MsgBean msgBean = JSON.parseObject(searchHit.getSourceAsString(), MsgBean.class);
list.add(msgBean);
}
}
return list;
}
}
In this article, we will discuss about “How to create a Spring Boot + Spring Data + Elasticsearch Example”.
Tools used in this article :
- Spring Boot 1.5.1.RELEASE
- Spring Boot Starter Data Elasticsearch 1.5.1.RELEASE
- Spring Data Elasticsearch 2.10.RELEASE
- Elasticsearch 2.4.4
- Maven
- Java 8
Note
SpringBoot 1.5.1.RELEASE and Spring Data Elasticsearch 2.10.RELEASE supports only ElasticSearch 2.4.0. They don’t support the latest version of ElasticSearch 5.x version. Read this –?Spring Data Elasticsearch Spring Boot version matrix文章來源:http://www.zghlxwxcb.cn/news/detail-413173.html
Related?–?Elasticsearch Basics文章來源地址http://www.zghlxwxcb.cn/news/detail-413173.html
到了這里,關于ElasticSearch多數(shù)據(jù)源配置,連接多個ES集群的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!