使用 Elasticsearch 搜索引擎,配置 ik 中文分词,与 Laravel 模型关联,然后实现搜索的业务逻辑。本篇是结束篇,使用 Laravel 的 Scout 扩展包完成搜索功能
续上篇,已经安装和配置好了 Scout 和支持 Elastic 的扩展包
编辑 Article 模型,将 LaravelScoutSearchable 这个 trait 加到你想要做检索的模型,这个 trait 会注册一个模型观察者来保持模型同步到检索服务的驱动:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;
class Article extends Model
{
// 引入这个 trait,这个 trait 会注册一个模型观察者来保持模型同步到检索服务的驱动
use Searchable;
//...
// 定义索引里面的 type(类型)-- es 中类型相当于 mysql 中的表
public function searchableAs()
{return 'article';}
// 定义有哪些字段需要搜索
public function toSearchableArray()
{
return [
'id' => $this->id,
'title' => $this->title,
'content' => $this->content
];
}
//...
}
使用 aritsan 命令,从 mysql 导入现有数据到 ElasticSearch
php artisan scout:import
查看一下 ElasticSearch 中是否存在配置的索引,和导入的数据大小
curl 'localhost:9200/_cat/indices?v'
ElasticSearch 的一些 RESTful api 调用方式,可以用来测试数据
查看索引的配置
curl -XGET "http://localhost:9200/mi360?pretty=true"
查看文档列表
curl -XGET "http://localhost:9200/mi360/_search?pretty=true"
查看指定 id=10 的文档
curl -XGET "http://localhost:9200/mi360/article/10?pretty=true"
ok!导入成功后,开始写搜索业务逻辑了
添加路由
Route::get('/search', 'WelcomeController@search');
编辑视图文件中的 form 表单,提交到路由的地址,并且 input 表单的 name=query
<form action="{{url('/search') }}" class="search fr">
<input type="text" name="query" placeholder="客官,想搜点啥?">
<button type="submit"> 搜索 </button>
</form>
编写控制器
public function search(Request $request)
{
$this->validate($request, ['query' => 'required',]);
// 转义特殊字符
$query = str_replace('/', '\/', strip_tags($request->get('query')));
// 分页,每页 10 条
$articles = Article::search($query)->paginate(10);
return view('welcome.search', compact('articles','query'));
}
编写搜索展示页面
// 展示搜索关键字和搜索到总条数
<div class="head clearf">
<h2 class="title fl active">
搜索:{{$query}}
<span class="search_count">(共搜索到 {{$articles->total() }} 条)</span>
</h2>
</div>
// 遍历搜索的结果
<ul class="content">
@foreach($articles as $article)
<li class="item">
<div class="row">
<h3 class="title"><a
href="{{route('articles.show', ['id'=> $article->id]) }}">{{$article->title}}</a>
</h3>
</div>
<div class="row">
<ul class="info">
<li>
<i></i>
<a href="{{route('users.show', ['id'=> $article->user->id,'name'=> $article->user->name]) }}">{{$article->user->name}}</a>
</li>
<li>
<i></i>
{{date('Y-m-d', strtotime($article->created_at)) }}
</li>
<li>
<i></i>
<a href="{{route('articles.index', ['category'=> $article->category->name]) }}">{{$article->category->name}}</a>
</li>
<li>
<i></i>
@foreach($article->tags as $tag)
<a href="{{route('articles.index', ['tag'=> $tag->name]) }}">{{$tag->name}}</a>
@endforeach
</li>
</ul>
</div>
<div class="row">
<div class="desc clearf">
<a href="{{route('articles.show', ['id'=> $article->id]) }}">
<img class="col-4 fl" src="{{$article->pic}}" alt="{{$article->title}}" title="{{$article->title}}">
</a>
<div class="text col-8 fr">
{{$article->intro}}
</div>
<div class="more">
<a href="{{route('articles.show', ['id'=> $article->id]) }}"> 阅读全文 </a>
</div>
</div>
</div>
</li>
@endforeach
</ul>
// 显示分页代码
<div class="links">
{{$articles->links() }}
</div>
ok!到此为止,咱们网站就添加上了全文搜索服务器了!
原文出处:http://www.mi360.cn/articles/40
相关文章:
11.Laravel 全文搜索 Elasticsearch (一)
12.Laravel 全文搜索 Elasticsearch (二)