您好,登錄后才能下訂單哦!
小編給大家分享一下Spring 4+ElasticSearch如何集成,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
一: ElasticSearch 基本概念
INDEX:這是ES存儲數據的地方,類似于關系數據庫的DATABASE。
Document TYPE:嗯,類似關系數據庫的表,主要功能是將完全不同SCHEMA(這個概念以后會講到,不急)的數據分開,一個INDEX里面可以有若干個Document TYPE。
Document:好吧,這個類似關系數據庫的一行,在同一個Document TYPE下面,每一Document都有一個唯一的ID作為區分;
Filed:類似關系數據庫的某一列,這是ES數據存儲的最小單位。
Cluster和Node:ES可以以單點或者集群方式運行,以一個整體對外提供search服務的所有節點組成cluster,組成這個cluster的各個節點叫做node。
shard:通常叫分片,這是ES提供分布式搜索的基礎,其含義為將一個完整的INDEX分成若干部分存儲在相同或不同的節點上,這些組成INDEX的部分就叫做shard。
Replica:和REPLICATION通常指的都是一回事,即INDEX的冗余備份,可以用于防止數據丟失,或者用來做負載分擔。
二: ElasticSearch TransportClient和NodeClient
如果你使用Java,ElasticSearch 提供Transport CLIENT和Node CLIENT兩種連接方式。transport CLIENT充當ES集群和你的應用直接的通信層,它知道API,并且能夠在節點間自動輪循。
Node CLIENT,事實上是集群中的一個節點(但是不存儲數據,并且不能作為主節點),由于它是一個節點,它知道整個集群的狀態(全部節點都在哪,哪些分片在哪些節點上等等),這意味著它執行API時可以少用一個網絡跳躍。
但需要完整的Node節點參數配置。
兩種CLIENT的使用場景:
1.如果你想讓你的應用和集群解耦,transport CLIENT是一個理想的選擇。例如,如果你的集群快速創建和銷毀連接,那么transport CLIENT比node CLIENT輕很多,因為它不是集群的一部分。
同樣,如果你需要創建上千個連接,但是你不希望有上千個node CLIENT加入你的集群,transport CLIENT將是一個更好的選擇。
2.在另一方面,如果你只需要幾個長連接的,能持久的連接到集群,node CLIENT會更高效一點,因為它知道集群的結構,但是要注意防火墻影響相關通信的問題。
三:與Spring 集成
@Configuration
@PropertySource("classpath:context-datasource.properties")
public class ElasticSearchElConfig {
@Value("${el.cluster.name}")
private String elClusterName;
@Value("${el.cluster.node1.url}")
private String elClusterNode1Url;
@Value("${el.cluster.node1.port}")
private Integer elClusterNode2Port;
@Bean(name = "elasticSearchClient")
public Client elasticSearchClient() {
Map<String, Object> settimgMap = new HashMap<String, Object>();
settimgMap.put("cluster.name", elClusterName);
Settings settings = Settings.settingsBuilder().put(settimgMap).build();
TransportClient client = TransportClient.builder().settings(settings).build()
.addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress(elClusterNode1Url, elClusterNode2Port)));
return client;
}
@Bean(name = "elasticTemplate")
public ElasticsearchTemplate elasticTemplate(Client elasticSearchClient) {
return new ElasticsearchTemplate(elasticSearchClient);
}
@Autowired
private Environment environment;
@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigure() {
return new PropertySourcesPlaceholderConfigurer();
}
}
四:Demo
文檔類
點擊(此處)折疊或打開
@Document(indexName="gmap_system_log_index",type="gmap_system_log")
public class Logs extends ValueObject{
/**
*
*/
private static final long serialVersionUID = 1L;
@Field(type=FieldType.Integer,index=FieldIndex.not_analyzed,store=true)
private Integer userId;
@Field(type=FieldType.String,index=FieldIndex.not_analyzed,store=true)
private String system;
@Field(type=FieldType.String,index=FieldIndex.not_analyzed,store=true)
private String url;
@Field(type=FieldType.String,index=FieldIndex.analyzed,store=true)
private String content;
/**
* @return the userId
*/
public Integer getUserId() {
return userId;
}
/**
* @param userId the userId to set
*/
public void setUserId(Integer userId) {
this.userId = userId;
}
/**
* @return the system
*/
public String getSystem() {
return system;
}
/**
* @param system the system to set
*/
public void setSystem(String system) {
this.system = system;
}
/**
* @return the url
*/
public String getUrl() {
return url;
}
/**
* @param url the url to set
*/
public void setUrl(String url) {
this.url = url;
}
/**
* @return the content
*/
public String getContent() {
return content;
}
/**
* @param content the content to set
*/
public void setContent(String content) {
this.content = content;
}
}
服務類
點擊(此處)折疊或打開
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.IndexQuery;
import org.springframework.data.elasticsearch.core.query.IndexQueryBuilder;
import org.springframework.stereotype.Component;
/**
* TODO:
*
* @author gengchong
* @date 2017年4月28日 下午4:24:01
*/
@Component("elasticSearchDemo")
public class ElasticSearchDemo {
@Autowired
private ElasticsearchTemplate elasticTemplate;
/**
* 創建索引
*/
public void createGmapLogsIndex() {
System.out.println(elasticTemplate.createIndex(Logs.class));
}
/**
* 批量添加文檔
*
* @param logs
*/
public void createGmapLogs(List<Logs> logs) {
List<IndexQuery> queries = new ArrayList<>();
for (Logs log : logs) {
IndexQuery indexQuery = new IndexQueryBuilder().withObject(log).build();
queries.add(indexQuery);
}
elasticTemplate.bulkIndex(queries);
}
/**
* 添加文檔
*
* @param log
*/
public void createGmapLog(Logs log) {
List<Logs> logs = new ArrayList<>();
logs.add(log);
createGmapLogs(logs);
}
}
以上是“Spring 4+ElasticSearch如何集成”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。