我对弹性搜索很陌生,我无法通过字段注释设置映射。我使用的是Spring data弹性4.3.4。我通过@Ssettings注解添加设置,这实际上是有效的。但是如果我将字段类型设置为Keyword,它不会更新,弹性会动态地将字段类型映射到文本。我的要求是添加一个规范化器来启用特定字段的字母排序。请在下面找到我的设置,我真的很感谢你的帮助。
配置:弹性搜索版本:“7.11.1”,Spring数据弹性4.3.4。
示例代码
@Document(indexName = "#{@environment.getProperty('elastic.index.prefix')}-test")
@设置(setingPath="/elasticsearch/analyzer. json")公共类ElasticTest{
@Id
String id;
@Field(type = FieldType.Keyword, normalizer="sort_normalizer")
private String name;
@Field
private String createdDate;
@Field(type=FieldType.Object)
private CustomerType customerType;
=============================================================================
所以一旦创建了索引,我就可以看到添加的设置
"creation_date" : "1664385255792",
"analysis" : {
"normalizer" : {
"sort_normalizer" : {
"filter" : [
"lowercase",
"asciifolding"
],
"type" : "custom",
"char_filter" : [ ]
}
},
"analyzer" : {
"custom_pattern_analyzer" : {
"lowercase" : "true",
"pattern" : """\W|_""",
"type" : "pattern"
}
}
},
映射:
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
注意:由于我在本地工作,我必须多次删除并重新创建索引。我可以通过curl/kibana设置这些字段类型。
更新:这里我们通过以下方式创建索引:
if (!searchTemplate.indexOps(ElasticContract.class).exists()) {
searchTemplate.indexOps(ElasticContract.class).create();
}
我们还使用Elasticsearch chRepository进行查询。
索引和映射是如何创建的?
如果您使用Spring Data Elasticsearch存储库,那么如果应用程序启动时尚不存在带有设置和映射的索引,则将创建该索引。
如果您不使用存储库,而是使用Elasticsearch chOper
,则需要自己创建索引:
ElasticsearchOperations operations;
IndexOperations indexOps = operations.indexOps(ElasticTest.class);
indexOps.createWithMapping();
如果您不创建索引而只是插入一些数据,那么Elasticsearch将自动创建索引和映射。您显示的映射是String字段的典型自动创建映射。
您使用的@Field
注释是正确的,我们在一个测试中有一个类似的设置来测试这种行为,请参阅https://github.com/spring-projects/spring-data-elasticsearch/blob/main/src/test/java/org/springframework/data/elasticsearch/core/index/MappingBuilderIntegrationTests.java#L126-L145