我是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。
答案 0 :(得分:1)
索引由多种类型组成(在版本6中,主要由于这个原因,这不再可能)。不同类型的问题是它们不能使用不同的映射存储相同的字段名称。这与它在Lucene中的存储方式有关。
您是否可以插入两种不同类型的文档?也许是偶然的(例如在输入文档时类型中的错字)。然后它可能会尝试通过动态映射创建一个不同的字段类型。这会引起您提到的异常。