【发布时间】:2020-08-21 02:24:08
【问题描述】:
我正在尝试使用 Spring Data Elasticsearch 4.0.1 并试图弄清楚 Elasticsearch 映射是如何以及何时由 Spring 创建的,或者它们是否是由 Spring 创建的。
如果我有这样的实体:
@Document(indexName = "companies")
public class CompanyEntity {
@Id
private final String id;
@MultiField(
mainField = @Field(type = Text),
otherFields = {
@InnerField(suffix = "raw", type = Keyword)
}
)
private final String companyName;
@PersistenceConstructor
public CompanyEntity(String id, String companyName) {
this.id = id;
this.companyName = companyName;
}
public String getId() {
return id;
}
public String getCompanyName() {
return companyName;
}
}
我的印象是 Spring 会隐式创建此索引的映射,但我似乎弄错了。 Elasticsearch 仍会为此索引创建映射。
{
"companies": {
"mappings": {
"properties": {
"_class": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"companyName": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"id": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
从上面很明显,InnerField 注释中的后缀没有被使用,并且 ignore_above 值也没有被使用,因为它默认为 -1,如果尝试将 ignore_above 设置为 -1,Elasticsearch 将完全删除该字段。
我能够获得上述注释映射的唯一方法是自己显式设置映射。
@Autowired private ElasticsearchOperations operations;
Document mapping = operations.indexOps(CompanyEntity.class).createMapping();
operations.indexOps(CompanyEntity.class).putMapping(mapping);
这会产生预期的映射:
{
"companies": {
"mappings": {
"properties": {
"_class": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"companyName": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
},
"id": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
这很好,但我觉得有点奇怪,因为我在官方Spring Data Elasticsearch docs 中找不到这种方法的任何细节。 JavaDocs 没有任何细节。
这是从 Spring Data 将映射安装到 Elasticsearch 的正确方法吗?
【问题讨论】:
-
1.使用 sprint-data-elastic (3.2.9.RELEASE) 创建了一个示例项目,并使用多字段(文本、关键字)定义了文档映射并运行了该项目。生成的映射是我所期望的。您能否分享您正在使用的 spring-data-elastic 和 elastic-search 的版本。
-
2.你可以在 ElasticsearchRestTemplate -> "putMapping(String indexName, String type, Object mapping)" 上设置一个调试点,看看生成了什么映射。
-
3.这是将映射从 Spring Data 安装到 Elasticsearch 的正确方法吗? - Es 不像 Mysql where-in 如果该字段在商店中不存在,你会得到一个异常,而是如果没有找到它会创建一个新字段。因此,只要您正确定义它并且生成的映射是您想要的,就可以通过 spring 数据安装映射。我能回答你所有的问题吗?
-
@SahilGupta,我使用的版本是 4.0.1。预期的映射是我在帖子中详细介绍的最后一个映射。我详细介绍的第一个映射是 Elasticsearch 自动创建的映射。我将尝试在 Spring 方面进行一些调试,以查看是否正在创建任何映射。关于您的最后一点,我知道我可能必须手动创建映射,但这确实打破了使用 Spring-Data 的期望。我正在尝试了解是否需要始终手动创建这些映射,因为此详细信息不在官方春季文档中。
标签: java spring spring-boot elasticsearch spring-data-elasticsearch