我遇到了SD Elasticsearch在应用程序启动时创建一些索引的问题。我有一些String字段,我希望它是“关键字”类型,但它们始终被创建为“text”类型。这是使用Elasticsearch 5.5.1,Spring 5.0.0,Spring Data Kay-RELEASE。
作为一个例子,我有类似的内容:
// DepartmentSearchResult.java
@Document(indexName = "hr_index", type = "department", createIndex = false)
public class DepartmentSearchResult implements Serializable {
@Id private String id;
private String foo;
// other fields, getters, setters etc. omitted
}
// DepartmentSearchingRepository.java
public interface DepartmentSearchingRepository extends ElasticsearchRepository<DepartmentSearchResult, String> {}
// ApplicationStartupListener.java
@Component
public class ApplicationStartupListener implements ApplicationListener<ContextRefreshedEvent> {
@Autowired ElasticsearchTempalte elasticSearchTemplate;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
if (!elasticSearchTemplate.indexExists(DepartmentSearchResult.class)) {
elasticSearchTemplate.createIndex(DepartmentSearchResult.class);
elasticSearchTemplate.putMapping(DepartmentSearchResult.class);
}
}
}
(我将createIndex设置为false并改为使用ApplicationStartupListener,因为我在How to correctly address "can't add a _parent field that points to an already existing type, that isn't already a parent" on app startup询问了一个问题。如果这与某种方式有关,请将其包括在内。)
无论如何,我希望DepartmentSearchResult.id是关键字,而不是文本。所以,我改变了:
@Id private String id;
为:
@Field(type=FieldType.keyword) @Id private String id;
然后我删除索引并重启我的应用程序。创建索引和映射,但“id”始终创建为文本,而不是关键字。其他领域正常运作;如果我将foo更改为映射中显示为关键字的@Field(type=FieldType.keyword) private String foo;
,那么这个id字段就是我无法工作的。
我目前的解决方法是手动创建映射,如:
curl -s -X PUT http://localhost:9200/hr_index/_mapping/department -d '{
"properties": {
"id": {
"type": "keyword"
}
}
}'
这是有效的,但我更喜欢Spring只是动态创建映射,所以我不需要维护一个单独的映射安装脚本。我应该看的任何地方可能表明为什么这个字段会被创建为“文本”?