Elasticsearch与其他类型的现有映射冲突

时间:2018-02-16 20:15:01

标签: php laravel elasticsearch mapping laravel-scout

我是Elasticsearch的新手,我在我的Laravel项目中使用Elasticsearch Scout Driver实现它,但是在索引中插入模型对象时出错了。

模型是帖子,如下所示:

>>> $post = App\Models\Post::first();
=> App\Models\Post {#853
     id: 1,
     title: "First Post",
     description: "My first post",
     created_at: "2017-09-13 13:31:51",
     updated_at: "2018-02-16 16:23:44",
     deleted_at: null,
   }

在模型类中,我声明了映射选项,我报告了我的映射选项:

// Map elements to be saved in Elasticsearch
protected $mapping = [
    'properties' => [
        'id' => [
            'type' => 'integer',
            'index' => false
        ],
        'title' => [
            'type' => 'text'
        ],
        'description' => [
            'type' => 'text'
        ],
        'created_at' => [
            'type' => 'date',
            'ignore_malformed' => true,
            'format' => "yyyy-MM-dd HH:mm:ss"
        ],
        'updated_at' => [
            'type' => 'date',
            'ignore_malformed' => true,
            'format' => "yyyy-MM-dd HH:mm:ss",
        ],
        'deleted_at' => [
            'type' => 'date',
            'ignore_malformed' => true,
            'format' => "yyyy-MM-dd HH:mm:ss",
        ]
    ]
];

每次我调用$post->searchable();将我的模型放入我的Elasticsearch索引中时,我都会遇到此错误:

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "Mapper for [deleted_at] conflicts with existing mapping in other types:\n[mapper [deleted_at] has different [format] values]"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "Mapper for [deleted_at] conflicts with existing mapping in other types:\n[mapper [deleted_at] has different [format] values]"
  },
  "status": 400
}

我猜这个问题是null属性的deleted_at值。 我需要 deleted_at == null,因为我使用 Laravel 管理soft deletion:任何其他值都会导致Laravel框架的软删除(查询时不检索元素)

正如你所看到的,我试图放ignore_malformed => true,但它对我不起作用。 我尝试添加另一个选项null_value => NULL但没有成功。

我哪里错了?

如何在我的Elasticsearch索引中插入帖子,deleted_at属性设置为null 设置为格式为yyyy-MM-dd HH:mm:ss的日期?

由于

PS:我正在使用Elasticsearch版本6.1.2。

1 个答案:

答案 0 :(得分:1)

索引由多种类型组成(在版本6中,主要由于这个原因,这不再可能)。不同类型的问题是它们不能使用不同的映射存储相同的字段名称。这与它在Lucene中的存储方式有关。

您是否可以插入两种不同类型的文档?也许是偶然的(例如在输入文档时类型中的错字)。然后它可能会尝试通过动态映射创建一个不同的字段类型。这会引起您提到的异常。