使用Elasticsearch搜索引擎,配置ik中文分词,与Laravel模型关联,然后实现搜索的业务逻辑。本篇是结束篇,使用Laravel的Scout扩展包完成搜索功能

续上篇,已经安装和配置好了Scout和支持Elastic的扩展包

编辑Article模型,将LaravelScoutSearchable 这个 trait加到你想要做检索的模型,这个trait会注册一个模型观察者来保持模型同步到检索服务的驱动:

<?phpnamespace 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 (二)