关键字字段自动创建,实体中没有任何映射 class
Keyword field created automatically without any mapping in Entity class
我的 ElasticSearch 版本是 7.6.2,我的 spring-boot-starter-data-elasticsearch 是 2.2.0 版本。
由于某些依赖性,我没有将 ES 升级到最新版本。
我面临的问题是 ES 索引有时是用 .keyword 字段创建的,有时它只是普通的文本字段。
下面是我的实体 class。我无法找到为什么会这样。我读到所有文本字段也会有关键字字段。但为什么不总是创建它。
我的实体class
@Setter
@Getter
@Document(indexName="myindex", createIndex=true, shards = 4)
public class MyIndex {
@Field(type = FieldType.Keyword)
private String place;
@Field(type = FieldType.Text)
private String name;
@Id
private String dynamicId = UUID.randomUUID().toString();
public MyIndex()
{}
ES 中的映射:
{
"mappings": {
"myindex": {
"properties": {
"place": {
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
},
"name": {
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
},
"dynamicId": {
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
}
}
}
}
}
有时它是为同一个实体创建的,如下所示class
{
"mappings": {
"myindex": {
"properties": {
"place": {
"type": "keyword"
},
"name": {
"type": "text"
},
"dynamicId": {
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
}
}
}
}
}
显示实体定义后,当 Spring Data Elasticsearch 创建索引并写入映射时,您将获得第二个示例中显示的映射以及这些属性值:
{
"properties": {
"place": {
"type": "keyword"
},
"name": {
"type": "text"
}
}
}
如果您想在 Spring Data Elasticsearch 中嵌套 keyword
属性,您必须在具有相应注释的实体上定义它。
请注意:@Id
属性 未显式映射,但会在首次索引文档时动态映射。
第一种情况下的映射和第二种情况下字符串映射为的部分
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
}
是 Elasticsearch 在使用之前未映射的文本字段为文档编制索引时使用的默认值 - 请参阅 docs about dynamic mapping。
所以您的第二个示例显示了由 Spring Data Elasticsearch 创建的索引的映射以及一些文档已被索引的位置。
如果其他应用程序创建索引并将数据写入索引,则第一个将由 Elasticsearch 创建。也可能是索引是在您的应用程序外部创建的,并且在应用程序启动时不会写入任何映射,因为索引已经存在。因此,您应该查看索引的创建方式。
我的 ElasticSearch 版本是 7.6.2,我的 spring-boot-starter-data-elasticsearch 是 2.2.0 版本。 由于某些依赖性,我没有将 ES 升级到最新版本。 我面临的问题是 ES 索引有时是用 .keyword 字段创建的,有时它只是普通的文本字段。 下面是我的实体 class。我无法找到为什么会这样。我读到所有文本字段也会有关键字字段。但为什么不总是创建它。
我的实体class
@Setter
@Getter
@Document(indexName="myindex", createIndex=true, shards = 4)
public class MyIndex {
@Field(type = FieldType.Keyword)
private String place;
@Field(type = FieldType.Text)
private String name;
@Id
private String dynamicId = UUID.randomUUID().toString();
public MyIndex()
{}
ES 中的映射:
{
"mappings": {
"myindex": {
"properties": {
"place": {
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
},
"name": {
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
},
"dynamicId": {
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
}
}
}
}
}
有时它是为同一个实体创建的,如下所示class
{
"mappings": {
"myindex": {
"properties": {
"place": {
"type": "keyword"
},
"name": {
"type": "text"
},
"dynamicId": {
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
}
}
}
}
}
显示实体定义后,当 Spring Data Elasticsearch 创建索引并写入映射时,您将获得第二个示例中显示的映射以及这些属性值:
{
"properties": {
"place": {
"type": "keyword"
},
"name": {
"type": "text"
}
}
}
如果您想在 Spring Data Elasticsearch 中嵌套 keyword
属性,您必须在具有相应注释的实体上定义它。
请注意:@Id
属性 未显式映射,但会在首次索引文档时动态映射。
第一种情况下的映射和第二种情况下字符串映射为的部分
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
}
是 Elasticsearch 在使用之前未映射的文本字段为文档编制索引时使用的默认值 - 请参阅 docs about dynamic mapping。
所以您的第二个示例显示了由 Spring Data Elasticsearch 创建的索引的映射以及一些文档已被索引的位置。
如果其他应用程序创建索引并将数据写入索引,则第一个将由 Elasticsearch 创建。也可能是索引是在您的应用程序外部创建的,并且在应用程序启动时不会写入任何映射,因为索引已经存在。因此,您应该查看索引的创建方式。