【问题标题】:Elasticsearch 6: Rejecting mapping update as the final mapping would have more than 1 typeElasticsearch 6:拒绝映射更新,因为最终映射将具有超过 1 种类型
【发布时间】:2018-06-12 15:01:16
【问题描述】:

我正在尝试将项目转换为使用最新的 Elasticsearch 6,但遇到了这个问题。我不知道问题是“产品”还是“产品”。在我的映射和属性中,我指定了“产品”,所以我不确定为什么在尝试索引产品时会出现此错误。

错误:

从对 PUT 的不成功的低级别调用构建的无效 NEST 响应: /products/products/1?pretty=true&error_trace=true

“拒绝对 [products] 的映射更新作为最终映射会 有超过 1 种类型:[Product, products]"

请求:

{
  "id": 1,
  "warehouseId": 0,
  "productStatus": 1,
  "sku": "102377",
  "name": "Name",
  "shortDescription": "Description",
  "longDescription": "Description",
  "price": 37.3200
}

我的代码:

    [ElasticsearchType(Name = "products")]
    public class Product : BaseEntity
    {
        [Key]
        public int Id { get; set; }
        public int WarehouseId { get; set; }
        [Display(Name = "Product Status")]
        public Enums.ProductStatus ProductStatus { get; set; }
        [Required, StringLength(10)]
        public string Sku { get; set; }
        [Required, StringLength(200)]
        public string Name { get; set; }
        [StringLength(500), Display(Name = "Short Description")]
        public string ShortDescription { get; set; }
        [DataType(DataType.MultilineText), Display(Name = "Long Description")]
        public string LongDescription { get; set; }
        [Column(TypeName ="Money")]            
        public Nullable<decimal> Price { get; set; }
    }

connection.DefaultMappingFor<Product>(m => m.IndexName("products"));

【问题讨论】:

标签: elasticsearch


【解决方案1】:

这是因为 ES 6.x 中的重大更改:mapping types 被删除(即使为了向后兼容,您仍然可以在路径中指定它)因此事实上将索引限制为单一类型。

See here 了解更多信息。

【讨论】:

  • 我正在尝试从 ES 5 迁移到 7,令我感到困惑的是,有些人说映射已被删除,因为他们仍在讨论版本 7 的文档中的映射:elastic.co/guide/en/elasticsearch/reference/7.x/mapping.html
  • 映射类型已被移除。在 ES6 之前,您可以在同一索引中定义多个映射类型(例如,userorder)。从 ES6 开始,索引被限制为单个映射(所以我们仍然有一个 mapping),使得 type 的概念变得多余。有关此更新背后的原因,请参阅文档 removal of mapping types
  • 谢谢Cavaz...你写的“映射被删除”让我很困惑......我想应该是“映射类型被删除”。
【解决方案2】:

在elasticsearch v6 之前,一个索引默认只能有1 个映射。在以前的 5.x 版本中,索引可以进行多个映射。虽然您可以通过更新索引设置 "index.mapping.single_type": false 来更改此默认设置。

在您的情况下,我的假设是您已经使用映射Product 创建了索引。这就是为什么它在您的第二个请求中拒绝使用“产品”(小写为 p)的新映射。

【讨论】:

    【解决方案3】:

    我删除了索引并重新创建了它,现在它看起来很好。我认为当我第一次创建索引时,我没有正确的属性名称,所以这可能解释了我遇到的错误。

    【讨论】:

      【解决方案4】:

      在我的情况下,我试图删除official docs 之后的记录,我盲目地将_doc 放入导致此错误的 URL 中。

      这应该是您在 AWS 控制台中的 Indices 选项卡下看到的与 Mappings 部分的映射。更改 URL 中的值为我解决了这个问题。

      希望这会有所帮助:)

      【讨论】:

        【解决方案5】:

        正如 Batsu 所说,从 elasticSearch 版本 5 开始,将索引视为数据库、将类型视为表的概念被移除,以实现 lucene 优化。

        解决方案是使用@Document 的索引。

        推荐人:https://www.elastic.co/guide/en/elasticsearch/reference/6.7/removal-of-types.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-06-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多