我正在使用Spring Data ElasticSearch 3.1.0.RELEASE与ElasticSearch一起工作,并且我对ElasticSearch本身还很陌生,对此了解得不多。
Here(spring-data-elastic docs)我看到文档的映射(架构)是使用元数据(注释)以动态方式自动生成的,与Spring Data MongoDB中的动态生成方式非常相似,但是在我们的组织中,所有实体均已注释带有@Mapping批注,并引用反映其结构的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,但是我可以理解此注释背后的整个想法。
无论如何,我仍然无法获得此注释的工作方式,用例是什么以及为什么需要它,从我的角度来看,我只是将其完全删除,因为可以基于其他模式自动生成模式Spring的注释。还是我错了?
与问题有关的其他要点:我也不知道:此映射JSON文件是否覆盖通过注释在实体中定义的结构?
ElasticsearchOperations
接口具有方法putMapping(class<?>)
。此方法可用于将索引映射写入索引。创建索引时,默认的非反应性存储库实现会执行此操作。
默认方法实现检查类上是否有@Mapping
批注。如果是,则使用此映射定义。如果不存在此批注,则将检查类并检查属性中的@Field
批注。
因此,在您的情况下,属性上的注释不用于编写索引映射。
我建议在类上使用属性,因为您更有可能在类中更改某些映射属性,而在json文件中忘记它。
例如,在您的代码中,将类sampleObject
中的定义为keyword
,但在映射中它是一个字符串。只看代码的人可能会错过不同的定义。