我有一个用例,其中我想根据特定条件在单独的索引中索引我的文档。例如,我想将发票文档存储到部门名称后缀的索引。
@Document(indexName="store_{department}", indexStoreType="invoice")
public class InvoiceES{
// fields
@Id
private String id;
@Field
private String department;
}
是否可以使用Spring Data实现这一目标?
如果没有,是否计划在即将发布的Spring Data中发布?
答案 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();