滚动索引(动态索引名称)在Spring Data Elasticsearch中

时间:2014-06-20 18:15:41

标签: elasticsearch spring-data

我有一个用例,其中我想根据特定条件在单独的索引中索引我的文档。例如,我想将发票文档存储到部门名称后缀的索引。

@Document(indexName="store_{department}", indexStoreType="invoice")
public class InvoiceES{

    // fields
    @Id
    private String id;
    @Field
    private String department;
}

是否可以使用Spring Data实现这一目标?

如果没有,是否计划在即将发布的Spring Data中发布?

6 个答案:

答案 0 :(得分:3)

就spring-boot-starter-data-elasticsearch-1.5而言,你可以通过spring el表达来实现它:

@Bean
Department department() {
    return new Department();
}

@Document(indexName="store_#{department.name()}", indexStoreType="invoice")
public class InvoiceES{}

您可以更改bean的属性以更改要保存/搜索的索引:

    invoiceRepo.save(new Invoice(...));
    department.setName("newName");
    invoiceRepo.save(new Invoice(...));

应该注意的是不要在多个线程中共享这个bean,这可能会弄乱你的索引。

答案 1 :(得分:0)

Vishal,

目前spring data elasticsearch不支持此功能。我们已经有了功能请求(拉取请求),将在下一个版本中添加。

看看这个拉动请求, https://github.com/spring-projects/spring-data-elasticsearch/pull/56

答案 2 :(得分:0)

@Document(indexName = "#{'${elasticsearch.index.name}'}", type = "category", shards = 1, replicas = 0, refreshInterval = "-1")

它创建了索引:"${elasticsearch.index.name}"

我尝试使用spring-data-elasticsearch版本1.1.2.RELEASE和1.2.0.M1,但根据jira(https://jira.spring.io/browse/DATAES-93),它在版本1.1 RC1中修复

答案 3 :(得分:0)

我不得不解决类似的问题,以使用动态索引名存储数据,该索引由当前日期组成:“ Index-name-YYYY.MM.DD”。

我制作了一个具有格式化日期字符串的吸气剂的组件:

@Component
public class ElasticIndex {

    private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");

    public String getIndexDate() {
        return formatter.format(LocalDate.now());
    }
}

因此,您的文档类将是这样的:

@Document(indexName = "my_data-#{elasticIndex.getIndexDate()}", type = "DataDoc")
public class DataDoc {

    @Id
    private String id;
    private String dataToStore;
    ....
}

因此,每次将新文档保存/删除/等到Elasticsearch存储库中时,它都会从ElasticIndex bean的getIndexDate方法获取索引名称。

在Spring Boot 2.2.5,Spring Data Elasticsearch 3.2.5上工作

答案 4 :(得分:0)

Spring 将创建实现 ElasticsearchOperations 的 Elasticsearch[Rest]Template bean。

ElasticsearchOperations 接口提供了 index(IndexQuery query) 函数来保存文档。

您可以使用 IndexQueryBuilder.withIndexName 覆盖索引名称。

答案 5 :(得分:-3)

我发现这样做的唯一方法是在没有@Document anotation的情况下手动完成:

        client = new TransportClient().addTransportAddress(new InetSocketTransportAddress(nodeId, port));

        IndexResponse response = client.prepareIndex(your_index, type, subid)
                .setSource(jsonBuilder()
                                .startObject()
                                .field("field1", field1))
                                .field("fileld2", field2)
                                ).endObject())
                .execute().actionGet();