解决laravel scout 导入成功但 Elasticsearch 没有数据
最近在使用elasticsearch
,就用了官方的扩展包laravel/scout
,用的是tamayo/laravel-scout-elastic
作为elasticsearch
驱动
复现问题出现步骤 :
- 创建索引
- 执行
php artisan scout:import [模型]
,执行成功,返回结果和文档一致 - 查看 elasticsearch 查看索引信息发现 doc 为 0 并未任何数据导入到elasticsearch 中
第一时间百度搜结果,有现成的就不用动脑子了,发现论坛里的小伙伴也有人出现这个问题,但是都没有解决问题或者说解决答案似是而非吧
- Scout 使用 import 成功,但 ES 却查询不到
- Larave + Scout + Elasticsearch 导入数据成功,但ES库中并没有数据
- Laravel-scout 导入数据显示成功,查询怎么为空呢?
没有现成方案,好吧,只能自己解决。
排查问题就用到了高中生物常用的控制变量法:
1 .判断是不是索引出了问题? (因为我是自建的索引)
往索引通过elasticsearch
的api
添加数据,导入成功 (排除自建索引问题)
- 排查是 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
解决问题: 原来在 elasticsearch 6.2.4
已经要逐步移除 type
,在版本 7.4
默认不在支持指定索引类型,默认索引类型是_doc(隐含:include_type_name=false), 而tamayo/laravel-scout-elastic
还是用模型名作为 index
的 type
所以如果我还想用 tamayo/laravel-scout-elastic
作为 elasticsearch
驱动怎么办呢??
很简单!!!给索引指定以模型名为type
就可以了。
只需要在请求中将 include_type_name
设置为 true
就可以了,并指定你的 type 就可以了
如下:
重建索引后,使用 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);
}
# 由代码可以看出并未对返回结果效验
第一次写文章,写的不全面不好的地方,大佬们多担待!
推荐文章: