Spring 4+ElasticSearch 整合

百聯達發表於2017-04-29
一: 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 整合


點選(此處)摺疊或開啟

  1. @Configuration
  2. @PropertySource("classpath:context-datasource.properties")
  3. public class ElasticSearchElConfig {
  4.     @Value("${el.cluster.name}")
  5.     private String elClusterName;
  6.     @Value("${el.cluster.node1.url}")
  7.     private String elClusterNode1Url;
  8.     @Value("${el.cluster.node1.port}")
  9.     private Integer elClusterNode2Port;

  10.     @Bean(name = "elasticSearchClient")
  11.     public Client elasticSearchClient() {
  12.         Map<String, Object> settimgMap = new HashMap<String, Object>();
  13.         settimgMap.put("cluster.name", elClusterName);

  14.         Settings settings = Settings.settingsBuilder().put(settimgMap).build();

  15.         TransportClient client = TransportClient.builder().settings(settings).build()
  16.                 .addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress(elClusterNode1Url, elClusterNode2Port)));
  17.         return client;

  18.     }

  19.     @Bean(name = "elasticTemplate")
  20.     public ElasticsearchTemplate elasticTemplate(Client elasticSearchClient) {
  21.         return new ElasticsearchTemplate(elasticSearchClient);
  22.     }

  23.     @Autowired
  24.     private Environment environment;

  25.     @Bean
  26.     public static PropertySourcesPlaceholderConfigurer propertyConfigure() {
  27.         return new PropertySourcesPlaceholderConfigurer();
  28.     }
  29. }

四:Demo

文件類


點選(此處)摺疊或開啟

  1. @Document(indexName="gmap_system_log_index",type="gmap_system_log")
  2. public class Logs extends ValueObject{

  3.     /**
  4.      *
  5.      */
  6.     private static final long serialVersionUID = 1L;
  7.     
  8.     @Field(type=FieldType.Integer,index=FieldIndex.not_analyzed,store=true)
  9.     private Integer userId;
  10.     @Field(type=FieldType.String,index=FieldIndex.not_analyzed,store=true)
  11.     private String system;
  12.     @Field(type=FieldType.String,index=FieldIndex.not_analyzed,store=true)
  13.     private String url;
  14.     @Field(type=FieldType.String,index=FieldIndex.analyzed,store=true)
  15.     private String content;
  16.     /**
  17.      * @return the userId
  18.      */
  19.     public Integer getUserId() {
  20.         return userId;
  21.     }
  22.     /**
  23.      * @param userId the userId to set
  24.      */
  25.     public void setUserId(Integer userId) {
  26.         this.userId = userId;
  27.     }
  28.     /**
  29.      * @return the system
  30.      */
  31.     public String getSystem() {
  32.         return system;
  33.     }
  34.     /**
  35.      * @param system the system to set
  36.      */
  37.     public void setSystem(String system) {
  38.         this.system = system;
  39.     }
  40.     /**
  41.      * @return the url
  42.      */
  43.     public String getUrl() {
  44.         return url;
  45.     }
  46.     /**
  47.      * @param url the url to set
  48.      */
  49.     public void setUrl(String url) {
  50.         this.url = url;
  51.     }
  52.     /**
  53.      * @return the content
  54.      */
  55.     public String getContent() {
  56.         return content;
  57.     }
  58.     /**
  59.      * @param content the content to set
  60.      */
  61.     public void setContent(String content) {
  62.         this.content = content;
  63.     }
  64.     
  65.     
  66. }

服務類


點選(此處)摺疊或開啟

  1. import java.util.ArrayList;
  2. import java.util.List;

  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
  5. import org.springframework.data.elasticsearch.core.query.IndexQuery;
  6. import org.springframework.data.elasticsearch.core.query.IndexQueryBuilder;
  7. import org.springframework.stereotype.Component;

  8. /**
  9.  * TODO:
  10.  *
  11.  * @author gengchong
  12.  * @date 2017年4月28日 下午4:24:01
  13.  */
  14. @Component("elasticSearchDemo")
  15. public class ElasticSearchDemo {

  16.     @Autowired
  17.     private ElasticsearchTemplate elasticTemplate;

  18.     /**
  19.      * 建立索引
  20.      */
  21.     public void createGmapLogsIndex() {
  22.         System.out.println(elasticTemplate.createIndex(Logs.class));
  23.     }

  24.     /**
  25.      * 批次新增文件
  26.      *
  27.      * @param logs
  28.      */
  29.     public void createGmapLogs(List<Logs> logs) {
  30.         List<IndexQuery> queries = new ArrayList<>();
  31.         for (Logs log : logs) {
  32.             IndexQuery indexQuery = new IndexQueryBuilder().withObject(log).build();
  33.             queries.add(indexQuery);
  34.         }

  35.         elasticTemplate.bulkIndex(queries);
  36.     }

  37.     /**
  38.      * 新增文件
  39.      *
  40.      * @param log
  41.      */
  42.     public void createGmapLog(Logs log) {
  43.         List<Logs> logs = new ArrayList<>();
  44.         logs.add(log);
  45.         createGmapLogs(logs);
  46.     }

  47. }


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-2138193/,如需轉載,請註明出處,否則將追究法律責任。

相關文章