Explorar o código

优化es索引策略

zhou-hao %!s(int64=5) %!d(string=hai) anos
pai
achega
4a8c0fca3b

+ 2 - 1
jetlinks-components/elasticsearch-component/src/main/java/org/jetlinks/community/elastic/search/configuration/ElasticSearchConfiguration.java

@@ -4,6 +4,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.elasticsearch.client.RestClient;
 import org.elasticsearch.client.RestHighLevelClient;
 import org.jetlinks.community.elastic.search.ElasticRestClient;
+import org.jetlinks.community.elastic.search.index.ElasticSearchIndexProperties;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.annotation.Bean;
@@ -15,7 +16,7 @@ import org.springframework.context.annotation.Configuration;
  **/
 @Configuration
 @Slf4j
-@EnableConfigurationProperties(ElasticSearchProperties.class)
+@EnableConfigurationProperties({ElasticSearchProperties.class, ElasticSearchIndexProperties.class})
 public class ElasticSearchConfiguration {
 
     @Autowired

+ 26 - 0
jetlinks-components/elasticsearch-component/src/main/java/org/jetlinks/community/elastic/search/index/ElasticSearchIndexProperties.java

@@ -0,0 +1,26 @@
+package org.jetlinks.community.elastic.search.index;
+
+import lombok.*;
+import org.elasticsearch.common.settings.Settings;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@Getter
+@Setter
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@ConfigurationProperties(prefix = "elasticsearch.index.settings")
+public class ElasticSearchIndexProperties {
+
+    private int numberOfShards = 1;
+
+    private int numberOfReplicas = 0;
+
+    public Settings toSettings() {
+
+        return Settings.builder()
+            .put("number_of_shards", Math.min(1, numberOfShards))
+            .put("number_of_replicas", numberOfReplicas)
+            .build();
+    }
+}

+ 22 - 0
jetlinks-components/elasticsearch-component/src/main/java/org/jetlinks/community/elastic/search/index/strategies/AbstractElasticSearchIndexStrategy.java

@@ -7,6 +7,7 @@ import org.elasticsearch.action.support.master.AcknowledgedResponse;
 import org.elasticsearch.client.RequestOptions;
 import org.elasticsearch.client.indices.*;
 import org.elasticsearch.cluster.metadata.MappingMetaData;
+import org.jetlinks.community.elastic.search.index.ElasticSearchIndexProperties;
 import org.jetlinks.core.metadata.DataType;
 import org.jetlinks.core.metadata.PropertyMetadata;
 import org.jetlinks.core.metadata.SimplePropertyMetadata;
@@ -31,6 +32,8 @@ public abstract class AbstractElasticSearchIndexStrategy implements ElasticSearc
 
     protected ElasticRestClient client;
 
+    protected ElasticSearchIndexProperties properties;
+
     protected String wrapIndex(String index) {
         return index.toLowerCase();
     }
@@ -185,4 +188,23 @@ public abstract class AbstractElasticSearchIndexStrategy implements ElasticSearc
         }
         return metadata;
     }
+
+    protected List<?> createDynamicTemplates() {
+        List<Map<String, Object>> maps = new ArrayList<>();
+        {
+            Map<String, Object> config = new HashMap<>();
+            config.put("match_mapping_type", "string");
+            config.put("mapping", createElasticProperty(new StringType()));
+            maps.add(Collections.singletonMap("string_fields", config));
+        }
+        {
+            Map<String, Object> config = new HashMap<>();
+            config.put("match_mapping_type", "date");
+            config.put("mapping", createElasticProperty(new DateTimeType()));
+            maps.add(Collections.singletonMap("date_fields", config));
+        }
+
+        return maps;
+    }
+
 }

+ 12 - 3
jetlinks-components/elasticsearch-component/src/main/java/org/jetlinks/community/elastic/search/index/strategies/TemplateElasticSearchIndexStrategy.java

@@ -8,16 +8,19 @@ import org.elasticsearch.client.indices.GetIndexTemplatesResponse;
 import org.elasticsearch.client.indices.PutIndexTemplateRequest;
 import org.jetlinks.community.elastic.search.ElasticRestClient;
 import org.jetlinks.community.elastic.search.index.ElasticSearchIndexMetadata;
+import org.jetlinks.community.elastic.search.index.ElasticSearchIndexProperties;
 import org.jetlinks.community.elastic.search.utils.ReactorActionListener;
 import reactor.core.publisher.Mono;
 
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 public abstract class TemplateElasticSearchIndexStrategy extends AbstractElasticSearchIndexStrategy {
 
-    public TemplateElasticSearchIndexStrategy(String id, ElasticRestClient client) {
-        super(id, client);
+    public TemplateElasticSearchIndexStrategy(String id, ElasticRestClient client, ElasticSearchIndexProperties properties) {
+        super(id, client,properties);
     }
 
     protected String getTemplate(String index) {
@@ -50,15 +53,21 @@ public abstract class TemplateElasticSearchIndexStrategy extends AbstractElastic
             .then(doPutIndex(metadata.newIndexName(getIndexForSave(metadata.getIndex())), true));
     }
 
+
     protected PutIndexTemplateRequest createIndexTemplateRequest(ElasticSearchIndexMetadata metadata) {
         String index = wrapIndex(metadata.getIndex());
         PutIndexTemplateRequest request = new PutIndexTemplateRequest(getTemplate(index));
         request.alias(new Alias(getAlias(index)));
-        request.mapping(Collections.singletonMap("properties", createElasticProperties(metadata.getProperties())));
+        request.settings(properties.toSettings());
+        Map<String, Object> mappingConfig = new HashMap<>();
+        mappingConfig.put("properties", createElasticProperties(metadata.getProperties()));
+        mappingConfig.put("dynamic_templates", createDynamicTemplates());
+        request.mapping(mappingConfig);
         request.patterns(getIndexPatterns(index));
         return request;
     }
 
+
     @Override
     public Mono<ElasticSearchIndexMetadata> loadIndexMetadata(String index) {
 

+ 9 - 6
jetlinks-standalone/src/main/resources/application.yml

@@ -42,6 +42,9 @@ elasticsearch:
     connection-request-timeout: 8000
   index:
     default-strategy: time-by-month #默认es的索引按月进行分表, direct则为直接操作索引.
+    settings:
+      number-of-shards: 1 # es 分片数量
+      number-of-replicas: 0 # 副本数量
 device:
   message:
     writer:
@@ -65,12 +68,12 @@ hsweb:
       static-location: http://localhost:8848/upload
   webflux:
     response-wrapper: enabled #开启响应包装器(将返回值包装为ResponseMessage)
-#  auth:   #默认的用户配置
-#    users:
-#      admin:
-#        username: admin
-#        password: admin
-#        name: 超级管理员
+  #  auth:   #默认的用户配置
+  #    users:
+  #      admin:
+  #        username: admin
+  #        password: admin
+  #        name: 超级管理员
   authorize:
     auto-parse: true
   cache: