Laravel + Elasticsearch 实现中文搜索的方法(4)

好了,我们执行 Kibana 看到我们已经创建好了 Index:

注 Kibana 本地 Docker 安装:后续会重点说明 Kibana 如何使用
docker run -d --name kibana -e ELASTICSEARCH_HOSTS=http://elasticsearch_host -p 5601:5601 -e SERVER_NAME=ki.test kibana:7.5.2
为了验证 Index 是否可用,可以插入一条数据看看:
curl -XPOST your_host/coding01_open/_create/1 -H 'Content-Type:application/json' -d'
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}

可以通过浏览器看看对应的数据:

有了 Index,下一步我们就可以结合 Laravel,导入、更新、查询等操作了。
Laravel Model 使用
Laravel 框架已经为我们推荐使用 Scout 全文搜索,我们只需要在 Article Model 加上官方所说的内容即可,很简单,推荐大家看 Scout 使用文档:https://learnku.com/docs/laravel/6.x/scout/5191,下面直接上代码:
<?php
namespace App;
use App\Tools\Markdowner;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Laravel\Scout\Searchable;
class Article extends Model
{
use Searchable;
protected $connection = 'blog';
protected $table = 'articles';
use SoftDeletes;
/**
* The attributes that should be mutated to dates.
*
* @var array
*/
protected $dates = ['published_at', 'created_at', 'deleted_at'];
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'user_id',
'last_user_id',
'category_id',
'title',
'subtitle',
'slug',
'page_image',
'content',
'meta_description',
'is_draft',
'is_original',
'published_at',
'wechat_url',
];
protected $casts = [
'content' => 'array'
];
/**
* Set the content attribute.
*
* @param $value
*/
public function setContentAttribute($value)
{
$data = [
'raw' => $value,
'html' => (new Markdowner)->convertMarkdownToHtml($value)
];
$this->attributes['content'] = json_encode($data);
}
/**
* 获取模型的可搜索数据
*
* @return array
*/
public function toSearchableArray()
{
$data = [
'id' => $this->id,
'title' => $this->title,
'subtitle' => $this->subtitle,
'content' => $this->content['html']
];
return $data;
}
public function searchableAs()
{
return '_doc';
}
}
内容版权声明:除非注明,否则皆为本站原创文章。
