我对ElasticSearch还很陌生,我不能通过字段注解来设置Map。我使用的是弹性Spring Data 4.3.4。我正在通过@Setting注解添加设置,该注解实际上起作用了。但是,如果我将字段类型设置为关键字,它不会被更新,而Elastic会动态地将字段类型Map到文本。我的要求是添加一个规范化程序,以便按字母顺序对特定字段进行排序。请在下面找到我的设置,我真的很感谢你的帮助。
配置:ElasticSearch版本:“7.11.1”,Spring Data 弹性4.3.4。
示例代码
@Document(indexName = "#{@environment.getProperty('elastic.index.prefix')}-test")
@Setting(settingPath=“/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"
}
}
},
Map:
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
注意:由于我在本地工作,我必须多次删除并重新创建索引。我可以通过curl/kibana设置这些字段类型。
更新:在这里,我们通过以下方式创建索引:
if (!searchTemplate.indexOps(ElasticContract.class).exists()) {
searchTemplate.indexOps(ElasticContract.class).create();
}
并且我们还使用Elasticearch Repository进行查询。
1条答案
按热度按时间pb3s4cty1#
如何创建索引和Map?
如果您使用的是Spring data Elasticearch存储库,则在应用程序启动时不存在带有该设置和Map的索引时,将创建该索引。
如果您不使用存储库,而是使用
ElasticsearchOperations
,则需要自己创建索引:如果您不创建索引,而只是插入一些数据,那么Elasticearch将自动创建索引和Map。您显示的Map是为字符串字段自动创建的典型Map。
您使用的
@Field
注解是正确的,我们在一个测试中有一个类似的设置来测试这个行为,请参见https://github.com/spring-projects/spring-data-elasticsearch/blob/main/src/test/java/org/springframework/data/elasticsearch/core/index/MappingBuilderIntegrationTests.java#L126-L145