解决laravel scout 导入成功但 Elasticsearch 没有数据

最近在使用elasticsearch,就用了官方的扩展包laravel/scout,用的是tamayo/laravel-scout-elastic作为elasticsearch驱动

复现问题出现步骤 :

  1. 创建索引
  2. 执行 php artisan scout:import [模型],执行成功,返回结果和文档一致
  3. 查看 elasticsearch 查看索引信息发现 doc 为 0 并未任何数据导入到elasticsearch 中

第一时间百度搜结果,有现成的就不用动脑子了,发现论坛里的小伙伴也有人出现这个问题,但是都没有解决问题或者说解决答案似是而非吧

没有现成方案,好吧,只能自己解决。

排查问题就用到了高中生物常用的控制变量法:

1 .判断是不是索引出了问题? (因为我是自建的索引)

往索引通过elasticsearchapi添加数据,导入成功 (排除自建索引问题)

  1. 排查是 scout 导入问题?

步骤:

···
//修改 searchableAs 
public function searchableAs() {
    return 'test'; 
}
···

后,并执行 php artisan scount:import

结果:test索引创建成功,数据导入成功,推断索引可能结构不一致。

3.通过 index/_mapping查看索引结构发现索引结构一致

4.对比自己通过api添加的数据与scout添加数据有何区别

发现问题:scout 添加的数据 _type 为模型名 如 App\\Models\\User , 自己添加的数据 type 则为 _doc

记录:解决laravel scout 导入成功但 ES没有数据

解决问题: 原来在 elasticsearch 6.2.4 已经要逐步移除 type ,在版本 7.4 默认不在支持指定索引类型,默认索引类型是_doc(隐含:include_type_name=false), 而tamayo/laravel-scout-elastic 还是用模型名作为 indextype

所以如果我还想用 tamayo/laravel-scout-elastic 作为 elasticsearch 驱动怎么办呢??

很简单!!!给索引指定以模型名为type就可以了。

只需要在请求中将 include_type_name 设置为 true 就可以了,并指定你的 type 就可以了

如下:

记录:解决laravel scout 导入成功但 ES没有数据

重建索引后,使用 php artisan scout:import导入, 这次 elasticsearch 里面有数据了!

解决问题!!!!!!!!

为什么没报错,经查看 tamayo/laravel-scout-elastic 中的源码 Tamayo\LaravelScoutElastic\Engines\ElasticsearchEngine 中的 update 方法为下:

    /**
     * Update the given model in the index.
     *
     * @param  Collection  $models
     * @return void
     */
    public function update($models)
    {
        if ($models->isEmpty()) {
            return;
        }

        $params['body'] = [];

        $models->each(function ($model) use (&$params) {
            $params['body'][] = [
                'update' => [
                    '_id' => $model->getScoutKey(),
                    '_index' => $model->searchableAs(),
                    '_type' => get_class($model),
                ]
            ];
            $params['body'][] = [
                'doc' => $model->toSearchableArray(),
                'doc_as_upsert' => true
            ];
        });

        $this->elastic->bulk($params);
    }


# 由代码可以看出并未对返回结果效验

第一次写文章,写的不全面不好的地方,大佬们多担待!

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 6

我刚好也在弄这个,有一个问题想请教一下,执行 php artisan scout:import [模型] 这个命令的报错,这个遇到过吗:

file

2年前 评论
保安 (楼主) 2年前
巴啦啦臭魔仙 (作者) 2年前
阿噗 1年前

我最近要用,用的还顺利?

1年前 评论
保安 (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!