12.Laravel全文搜索Elasticsearch (三)

使用Elasticsearch搜索引擎,配置ik中文分詞,與Laravel模型關聯,而後實現搜索的業務邏輯。本篇是結束篇,使用Laravel的Scout擴展包完成搜索功能

續上篇,已經安裝和配置好了Scout和支持Elastic的擴展包php

編輯Article模型,將LaravelScoutSearchable 這個 trait加到你想要作檢索的模型,這個trait會註冊一個模型觀察者來保持模型同步到檢索服務的驅動:mysql

<?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導入現有數據到ElasticSearchsql

php artisan scout:import

查看一下ElasticSearch中是否存在配置的索引,和導入的數據大小api

curl 'localhost:9200/_cat/indices?v'

ElasticSearch的一些RESTful api調用方式,能夠用來測試數據服務器

查看索引的配置curl

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!導入成功後,開始寫搜索業務邏輯了ui

添加路由this

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

相關文章
相關標籤/搜索