我正在使用Spring Data ElasticSearch 3.1.0.RELEASE与ElasticSearch一起工作,并且我对ElasticSearch本身还很陌生,对此了解不多。
Here(spring-data-elastic docs)我看到文档的映射(架构)是使用元数据(注释)自动生成的,与Spring Data MongoDB中的动态生成方式非常相似,但是在我们的组织中,所有实体都使用@Mapping注释和请参阅反射(reflect)其结构的JSON文档,因此对于每个文档实体-编写JSON文件,尽管所有实体都有各自的注释。
示例类的一小段提示我正在谈论
@Document(indexName = "sampleIndex", type = "sample", shards = 16, createIndex = false)
@Mapping(mappingPath = "/elasticsearch/mappings/sample.json")
public final class Sample {
@Id
private String id;
@Field(type = FieldType.Long)
private long sampleId;
@Field(type = FieldType.Keyword)
private SampleObject sampleObject;
@Field(type = FieldType.Nested)
private Map<String, String> data;
和相应的
/elasticsearch/mappings/sample.json
文件{
"samples": {
"mappings": {
"sample": {
"properties": {
"sampleId": {
"type": "long"
},
"sampleObject": {
"type": "string"
},
"data": {
"type": "nested"
},
....
大概,尽管我什至在(spring-data-elastic docs)中都看不到任何注释,也看不到任何有意义的JavaDocs,但我可以理解此注释背后的整个想法。
无论如何,我仍然无法获得该注释的工作方式,用例是什么以及为什么需要它,从我的 Angular 来看,我将其完全删除,因为可以根据其他注释自动生成模式 Spring 。还是我错了?
与问题有关的其他要点:我也不知道:此映射JSON文件是否会覆盖通过注释在实体中定义的结构?
最佳答案
ElasticsearchOperations
接口(interface)具有putMapping(class<?>)
方法。此方法可用于将索引映射写入索引。创建索引时,默认的非反应性存储库实现会执行此操作。
默认方法实现检查类上是否有@Mapping
批注。如果是,则使用此映射定义。如果不存在此批注,则将检查类并检查属性上的@Field
批注。
因此,在您的情况下,属性上的注释不用于编写索引映射。
我建议使用该类的属性,因为您更有可能在该类中更改某些映射属性,而在json文件中忘记它。
例如,在您的代码中,类sampleObject
被定义为keyword
,但int映射是一个字符串。仅仅看代码的人可能会错过不同的定义。