Spring Data Elasticsearch设置注解没有生效
Spring Data Elasticsearch setting annotation did not take effect
我正在尝试使用 spring 数据弹性搜索,并有一个 class 定义如下:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "master", type = "master", shards = 1, replicas = 0)
@Setting(settingPath = "/settings/setting.json")
public class Master {
@Id
private String id;
@MultiField(mainField = @Field(type = FieldType.String, store = true),
otherFields = {
@InnerField(suffix = "autocomplete", type = FieldType.String, indexAnalyzer = "autocomplete", searchAnalyzer = "standard")
}
)
private String firstName;
private String lastName;
}
设置文件在/src/main/settings/setting.json
下面,看起来像这样
{
"index": {
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 20
}
},
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"autocomplete_filter"
]
}
}
}
}
}
我运行我的测试class首先删除索引,然后像这样重新创建索引
elasticsearchTemplate.deleteIndex(Master.class);
elasticsearchTemplate.createIndex(Master.class);
elasticsearchTemplate.putMapping(Master.class);
elasticsearchTemplate.refresh(Master.class);
但是当我尝试将某些内容保存到索引中时,出现了 MapperParsingException 的错误消息:
2017-10-04 18:56:31.806 ERROR 2942 --- [ main] .d.e.r.s.AbstractElasticsearchRepository : failed to load elasticsearch nodes : org.elasticsearch.index.mapper.MapperParsingException: analyzer [autocomplete] not found for field [autocomplete]
花了 4 个小时试图解决这个问题,查看了调试模式日志,什么也没有。
我试图通过删除一个逗号来破坏 JSON 格式,它破坏了 JSON 被解释。
我使用 RestAPI 查询主索引,但设置似乎不包含自动完成分析器或任何分析器。
奇怪的是,我的文档竟然出现了这个错误,还能保存和查询。但我确实想要这个分析仪。
顺便说一句,如果相关的话,这是 parent-child 关系中的 parent class。
终于明白了!
我必须使用相同的索引(父域和子域)在所有域中设置相同的设置,然后删除索引,重新启动服务器,它成功了!
我正在尝试使用 spring 数据弹性搜索,并有一个 class 定义如下:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "master", type = "master", shards = 1, replicas = 0)
@Setting(settingPath = "/settings/setting.json")
public class Master {
@Id
private String id;
@MultiField(mainField = @Field(type = FieldType.String, store = true),
otherFields = {
@InnerField(suffix = "autocomplete", type = FieldType.String, indexAnalyzer = "autocomplete", searchAnalyzer = "standard")
}
)
private String firstName;
private String lastName;
}
设置文件在/src/main/settings/setting.json
下面,看起来像这样
{
"index": {
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 20
}
},
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"autocomplete_filter"
]
}
}
}
}
}
我运行我的测试class首先删除索引,然后像这样重新创建索引
elasticsearchTemplate.deleteIndex(Master.class);
elasticsearchTemplate.createIndex(Master.class);
elasticsearchTemplate.putMapping(Master.class);
elasticsearchTemplate.refresh(Master.class);
但是当我尝试将某些内容保存到索引中时,出现了 MapperParsingException 的错误消息:
2017-10-04 18:56:31.806 ERROR 2942 --- [ main] .d.e.r.s.AbstractElasticsearchRepository : failed to load elasticsearch nodes : org.elasticsearch.index.mapper.MapperParsingException: analyzer [autocomplete] not found for field [autocomplete]
花了 4 个小时试图解决这个问题,查看了调试模式日志,什么也没有。
我试图通过删除一个逗号来破坏 JSON 格式,它破坏了 JSON 被解释。
我使用 RestAPI 查询主索引,但设置似乎不包含自动完成分析器或任何分析器。
奇怪的是,我的文档竟然出现了这个错误,还能保存和查询。但我确实想要这个分析仪。
顺便说一句,如果相关的话,这是 parent-child 关系中的 parent class。
终于明白了!
我必须使用相同的索引(父域和子域)在所有域中设置相同的设置,然后删除索引,重新启动服务器,它成功了!