springboot elasticsearch 索引名不确定, 如何映射字段 驼峰转下划线
时间: 2024-02-23 10:59:17 浏览: 216
可以使用 Elasticsearch 的 dynamic templates 功能,通过配置模板来实现字段的映射。
首先,在 Spring Boot 中配置 Elasticsearch 的时候,可以使用 `ElasticsearchRestTemplate` 来操作 Elasticsearch。在创建 `ElasticsearchRestTemplate` 的时候,可以指定一个 `ElasticsearchConverter` 对象,用于将 Java 对象转换成 Elasticsearch 中的文档。在 `ElasticsearchConverter` 中,可以使用 `MappingElasticsearchConverter` 对象来实现字段映射。
具体的操作步骤如下:
1. 配置 `ElasticsearchRestTemplate`,指定 `ElasticsearchConverter` 对象:
```java
@Configuration
public class ElasticsearchConfig {
@Bean
public ElasticsearchRestTemplate elasticsearchTemplate(RestHighLevelClient client, ElasticsearchConverter converter) {
return new ElasticsearchRestTemplate(client, converter);
}
@Bean
public ElasticsearchConverter elasticsearchConverter() {
MappingElasticsearchConverter converter = new MappingElasticsearchConverter(elasticsearchMappingContext());
converter.setTypeMapper(new DefaultElasticsearchTypeMapper(null));
return converter;
}
@Bean
public ElasticsearchMappingContext elasticsearchMappingContext() {
return new ElasticsearchMappingContext();
}
}
```
2. 在 `ElasticsearchMappingContext` 中配置 dynamic templates:
```java
@Configuration
public class ElasticsearchConfig {
@Bean
public ElasticsearchMappingContext elasticsearchMappingContext() {
ElasticsearchMappingContext context = new ElasticsearchMappingContext();
context.setInitialEntitySet(getInitialEntitySet());
context.setSimpleTypeHolder(customSimpleTypeHolder());
context.setApplicationContext(applicationContext);
// 配置 dynamic templates
context.setDynamicTemplates(Arrays.asList(
new DynamicTemplate("camel_case_to_underscore", new MappingBuilder()
.match("*")
.unmatch("*_text")
.mapping(new ObjectMapping()
.setType("text")
.setNormalizer("lowercase")
.addProperty("type", "keyword")
.addProperty("fields", new ObjectMapping()
.addProperty("raw", new ObjectMapping()
.setType("keyword")
)
)
)
)
));
return context;
}
}
```
上述代码中,我们创建了一个名为 `camel_case_to_underscore` 的 dynamic template,并将其应用到所有字段上(使用 `match("*")`),但排除了以 `_text` 结尾的字段(使用 `unmatch("*_text")`)。对于所有匹配的字段,我们都将其映射为 `text` 类型,使用 `lowercase` 正则表达式将其转换为小写,同时添加了一个 `raw` 子字段,用于排序和聚合操作。
这样,我们就完成了将 Java 中的驼峰命名转换为 Elasticsearch 中的下划线命名的操作。在使用 `ElasticsearchRestTemplate` 进行 CRUD 操作时,会自动将 Java 对象转换为 Elasticsearch 中的文档,并将字段映射为下划线命名。
阅读全文