关键字字段自动创建,实体中没有任何映射 class

Keyword field created automatically without any mapping in Entity class

我的 ElasticSearch 版本是 7.6.2,我的 spring-boot-starter-data-elasticsearch 是 2.2.0 版本。 由于某些依赖性,我没有将 ES 升级到最新版本。 我面临的问题是 ES 索引有时是用 .keyword 字段创建的,有时它只是普通的文本字段。 下面是我的实体 class。我无法找到为什么会这样。我读到所有文本字段也会有关键字字段。但为什么不总是创建它。

我的实体class

@Setter
@Getter
@Document(indexName="myindex", createIndex=true, shards = 4)
public class MyIndex { 

    @Field(type = FieldType.Keyword)
     private String place;  
    @Field(type = FieldType.Text)
     private String name;       
    @Id 
    private String dynamicId = UUID.randomUUID().toString();

    public MyIndex()
    {}

ES 中的映射:

{
  "mappings": {
    "myindex": {
      "properties": {
        "place": {
          "type": "text",
          "fields": {
            "keyword": {
              "ignore_above": 256,
              "type": "keyword"
            }
          }
        },
        "name": {
          "type": "text",
          "fields": {
            "keyword": {
              "ignore_above": 256,
              "type": "keyword"
            }
          }
        },
        "dynamicId": {
          "type": "text",
          "fields": {
            "keyword": {
              "ignore_above": 256,
              "type": "keyword"
            }
          }
        }
      }
    }
  }
}

有时它是为同一个实体创建的,如下所示class

{
  "mappings": {
    "myindex": {
      "properties": {
        "place": {
          "type": "keyword"
        },
        "name": {
          "type": "text"
        },
        "dynamicId": {
          "type": "text",
          "fields": {
            "keyword": {
              "ignore_above": 256,
              "type": "keyword"
            }
          }
        }
      }
    }
  }
}

显示实体定义后,当 Spring Data Elasticsearch 创建索引并写入映射时,您将获得第二个示例中显示的映射以及这些属性值:

{
  "properties": {
    "place": {
      "type": "keyword"
    },
    "name": {
      "type": "text"
    }
  }
}

如果您想在 Spring Data Elasticsearch 中嵌套 keyword 属性,您必须在具有相应注释的实体上定义它。

请注意:@Id 属性 未显式映射,但会在首次索引文档时动态映射。

第一种情况下的映射和第二种情况下字符串映射为的部分

  "type": "text",
  "fields": {
    "keyword": {
      "ignore_above": 256,
      "type": "keyword"
    }
  }
}

是 Elasticsearch 在使用之前未映射的文本字段为文档编制索引时使用的默认值 - 请参阅 docs about dynamic mapping

所以您的第二个示例显示了由 Spring Data Elasticsearch 创建的索引的映射以及一些文档已被索引的位置。

如果其他应用程序创建索引并将数据写入索引,则第一个将由 Elasticsearch 创建。也可能是索引是在您的应用程序外部创建的,并且在应用程序启动时不会写入任何映射,因为索引已经存在。因此,您应该查看索引的创建方式。