我正在使用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映射是一个字符串。仅仅看代码的人可能会错过不同的定义。

10-07 20:00
查看更多