1

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

该模型是Post,制作如下:

>>> $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价值。我需要,因为我使用Laravel进行管理:任何其他值都会导致 Laravel 框架的软删除(查询时不检索元素)。deleted_at deleted_at == nullsoft deletion

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

我哪里错了?

如何在我的 Elasticsearch 索引中插入帖子,并将deleted_at属性设置为null OR设置为 date with format yyyy-MM-dd HH:mm:ss

谢谢

PS:我使用的是 Elasticsearch 版本 6.1.2。

4

1 回答 1

1

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

可能是您要插入两种不同类型的文档吗?可能是偶然的(例如,在摄取文档时输入错误)。然后它可能会尝试通过动态映射来创建不同的字段类型,比如一个字符串。这将导致您提到的异常。

于 2018-02-17T07:30:19.810 回答