12.Laravel全文搜索Elasticsearch (三)

栏目: PHP · 发布时间: 4年前

内容简介:使用Elasticsearch搜索引擎,配置ik中文分词,与Laravel模型关联,然后实现搜索的业务逻辑。本篇是结束篇,使用Laravel的Scout扩展包完成搜索功能续上篇,已经安装和配置好了Scout和支持Elastic的扩展包编辑Article模型,将LaravelScoutSearchable 这个 trait加到你想要做检索的模型,这个trait会注册一个模型观察者来保持模型同步到检索服务的驱动:

使用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


以上所述就是小编给大家介绍的《12.Laravel全文搜索Elasticsearch (三)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算机网络(第5版)

计算机网络(第5版)

Andrew S. Tanenbaum、David J. Wetherall / 严伟、潘爱民 / 清华大学出版社 / 2012-3-1 / 89.50元

本书是国内外使用最广泛、最权威的计算机网络经典教材。全书按照网络协议模型自下而上(物理层、数据链路层、介质访问控制层、网络层、传输层和应用层)有系统地介绍了计算机网络的基本原理,并结合Internet给出了大量的协议实例。在讲述网络各层次内容的同时,还与时俱进地引入了最新的网络技术,包括无线网络、3G蜂窝网络、RFID与传感器网络、内容分发与P2P网络、流媒体传输与IP语音,以及延迟容忍网络等。另......一起来看看 《计算机网络(第5版)》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

MD5 加密
MD5 加密

MD5 加密工具