【问题标题】:Spring Data Elastic Search with dynamic document replicas and shards具有动态文档副本和分片的 Spring Data Elastic Search
【发布时间】:2021-09-05 02:24:13
【问题描述】:

我正在使用 spring boot 2.4 和 spring-data-elasticsearch 4.1。我有这样的文件

@Document(indexName = "test", replicas = 3, shards = 2)
public class TestDocument {
  @Id
  @Field(type = FieldType.Keyword)
  private String Id;

  @Field(type = FieldType.Object, enabled = false)
  private String name;
  ...
  getters
  setters
}

并且我想覆盖来自 application.yml 的文档注释中的副本和分片中的硬编码值以创建索引,因为这些值可能因我的服务环境而异。有没有办法做到这一点?

【问题讨论】:

    标签: elasticsearch spring-data spring-data-elasticsearch


    【解决方案1】:

    您可以通过使用禁用索引的自动创建

    @Document(indexName = "test", createIndex = false)
    

    然后使用IndexOperations.create(settings) 创建索引。以下代码取自 Spring Data Elasticsearch 测试 (https://github.com/spring-projects/spring-data-elasticsearch/blob/4.1.x/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java#L2361-L2384):

        public void shouldCreateIndexWithGivenClassAndSettings() {
    
            // given
            String settings = "{\n" + "        \"index\": {\n" + "            \"number_of_shards\": \"1\",\n"
                    + "            \"number_of_replicas\": \"0\",\n" + "            \"analysis\": {\n"
                    + "                \"analyzer\": {\n" + "                    \"emailAnalyzer\": {\n"
                    + "                        \"type\": \"custom\",\n"
                    + "                        \"tokenizer\": \"uax_url_email\"\n" + "                    }\n"
                    + "                }\n" + "            }\n" + "        }\n" + '}';
    
            // when
            indexOperations.delete();
            indexOperations.create(parse(settings));
            indexOperations.putMapping(SampleEntity.class);
            indexOperations.refresh();
    
            // then
            Map<String, Object> map = indexOperations.getSettings();
            assertThat(operations.indexOps(IndexCoordinates.of(INDEX_NAME_SAMPLE_ENTITY)).exists()).isTrue();
            assertThat(map.containsKey("index.number_of_replicas")).isTrue();
            assertThat(map.containsKey("index.number_of_shards")).isTrue();
            assertThat((String) map.get("index.number_of_replicas")).isEqualTo("0");
            assertThat((String) map.get("index.number_of_shards")).isEqualTo("1");
        }
    

    您应该在代码中创建Document,而不是为设置解析 JSON:

    Document settings = Document.create();
    settings.put("index.number_of_replicas", 42);
    settings.put("index.number_of_shards", 42);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 2019-03-12
      • 2016-03-29
      • 2014-07-06
      相关资源
      最近更新 更多