在 Laravel 项目中使用 Elasticsearch 做引擎,scout 全文搜索(小白出品, 绝对白话)

时间:2022-08-27 09:50:47

项目中需要搜索, 所以从零开始学习大家都在用的搜索神器 elasiticsearch. 刚开始 google 的时候, 搜到好多经验贴和视频(中文的, 英文的), 但是由于是第一次接触, 一点概念都没有, 大家介绍的方法又有点不尽相同, 所以有点懵逼, 最后经过层层筛选, 终于找到组织 Elasticsearch: 权威指南. 这是中文翻译版的, 我目前觉得还可以哈, 语言比较朴实.

然后呢, 因为我自己在从下载安装这些基本的操作过程中都走了很多的弯路, 所以我把最实用的干货还是总结一下, 方便下次直接上手, 最起码可以先跑起来哈. 至于对于 elasticsearch 的深入理解, 大家还是看<<权威指南>>吧.

第一步: 下载安装 ES

我真的是找到了各种版本的下载安装命令, 有些命令根本跑不通, 让我很是头大, 当然, 我自己是 macos 系统的, 所以我的一切安装步骤也都只是保证绝对适用于 macos:

  1. 到官网下载压缩包 根据自己的系统选择哈: 在 Laravel 项目中使用 Elasticsearch 做引擎,scout 全文搜索(小白出品, 绝对白话)
  2. 把压缩包解压, 解压后的文件我暂且放在我现在做的项目里了, 然后在终端进入这个文件.(这里说明一下, 只要进入你刚刚下载的那个文件夹就行了, 版本号不用 copy 我的, 因为有可能已经更新了.)
cd elasticsearch-6.6.1

之后, 执行下面的命令启动服务(如果你想把 Elasticsearch 作为一个守护进程在后台运行,那么可以在后面添加参数 -d):

./bin/elasticsearch

通过以上两步, 应该说 elasticsearch 就已经开始为你的站点服务了. 为了 double check 是否启动成功,可以打开另一个终端,执行以下操作:

curl 'http://localhost:9200/?pretty'

如果你能得到类似下面的结果, 就意味着你现在已经启动并运行一个 Elasticsearch 节点了:

{
"name" : "27qRw7J",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "RFuFAGLaRVqtlJOyn-hFWA",
"version" : {
"number" : "6.6.1",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "1fd8f69",
"build_date" : "2019-02-13T17:10:04.160291Z",
"build_snapshot" : false,
"lucene_version" : "7.6.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}

第二步: 安装中文分词插件 IK

Elasticsearch原装分词器会简单地拆分每个汉字,没有根据词库来分词,这样的后果就是搜索结果很可能不是你想要的。这里推荐使用elasticsearch-analysis-ik,支持自定义词库。 文档推荐了两种下载安装方式, 两种我都试了, 但是第二种一直报错, google 了一下, 很多人都有这个问题, 貌似是不支持了....额. 所以就推荐大家直接用第一种方式吧, 就是直接下载文件, 解压之后放到 your-es-root/plugins/ik 文件夹里. 这种方法理论上是没啥问题的, 但是我依然踩了一个很丢人的坑, 估计大部分都不会犯这个错误吧, 就是我是手动解压的, 解压之后生成了一个文件夹, 我就把这个文件夹直接放到 ik 文件夹里了, 然后重启 es 的时候就一直报错. 所以应该是把解压后的文件夹里的所有文件都直接放进 ik 文件夹里~~~~~

然后重启 es 就好了.

第三步: 安装 scout

这个是 laravel 官方推出的全文搜索包, 是针对Eloquent 模型开发的一个简单的,基于驱动的全文检索系统. 如果你跟我一样也是第一次接触, 肯定也会觉得这句话有点晦涩难懂吧, 没关系, 我开始也是这样的. 通过把整个过程理顺之后, 我现在的白话理解就是, elasticsearch 就好比是一个数据库, 只不过跟 mysql 的存储方式不同. 这个数据库虽然使用 java 写的, 但是它也支持很多很多其他语言, 大家都可以以 RESTful API 的形式跟它交互(无非就是存储数据啦). 也就是说, 针对不同的请求它都有相应的接口暴露出来, 那我们可以直接使用这些接口的, 就好像你直接写 sql 语句查数据库一样, 但是 贴心的 laravel 觉得原生请求太不优雅了, 所以它封装了一个包 scout. 好了, 希望我这翻废话能对你理清关系有所帮助. 下面开始安装了:

先安装 scout 的 es 驱动 tamayo/laravel-scout-elastic:

composer require tamayo/laravel-scout-elastic

, 这里要说明一下, 目前这个包的最新版本是 4.0.0, 而这个版本只支持 scout ^5.0 的版本, 所以尽管此时 scout 的最新版本已经到了 7.0, 我在安装 scout 的时候还是要指明 5.0 的版本:

composer require laravel/scout ^5.0

通过 laravel/scout 的官方文档可以看到, 它是默认只支持使用 Algolia 驱动, 但是我们的目标是用 es 做驱动, 所以要改一下 config/scout.php 的配置.

找到下面这行代码:

‘driver’ => env(‘SCOUT_DRIVER’, ‘algolia’),

把它改为:

‘driver’ => env(‘SCOUT_DRIVER’, ‘elasticsearch’),

之后, 在最下面添加如下代码:

elasticsearch’ => [
‘index’ => env(‘ELASTICSEARCH_INDEX’, ‘laravel’), ‘config’ => [
‘hosts’ => [
env(‘ELASTICSEARCH_HOST’, ‘localhost’),
],
],
],

然后在 .env 文件中添加:

ELASTICSEARCH_INDEX=scout
ELASTICSEARCH_HOST=http://localhost:9200

以上, 算是把工具都准备齐了, 下面就是开干了.

但是, 在开始之前, 还想再说几句废话, 就是建议大家还是看一下  Elasticsearch: 权威指南, 虽然我也还没有完全看完, 但是最起码在我对 es 存储数据的结构, 在脑海里是有大概了解的, 也就是对像 "索引", "文档" 这些概念都知道是代表什么的, 这些在权威指南里都解释得很白话的, 我是觉得在我这篇文章里, 很难去解释的那么清楚...... 所以, 如果你不是那么赶时间的话, 还是建议先去大概过一遍. 如果实在没时间, 就跟着下面的步骤做, 也是 OK 嗒.

接下来, 以我自己的项目为例, 我有一个 Post 表需要做全文索引, 我的表是已经建好的, 里面也已经有 40条测试数据, 现在我就要把这个表索引到 es 中:

php artisan scout:import "App\Post"

会得到下面的反馈, 证明导入成功了:

Imported [App\Post] models up to ID: 40
All [App\Post] records have been imported.

下面测试一下搜索功能, 打开 tinker:

php artisan tinker

执行以下命令:

App\Post::search('Blake Swaniawski')->get();

如果一切正常的话, 应该会返回一堆 JSON 字符串(注意: 这里换成你自己的 model)

通过简单的测试以后, 我们就可以应用到项目中啦.
新建一个 searchController:

php artisan make:controller SearchController

打开这个新建的 controller 文件, 添加如下方法:

public function search(Request $request){

        if($request->has('search')){
$posts = Post::search($request->input('search'))->get();
}
return view('web.search.results', compact('posts'));
}

打开 web.php 文件, 添加路由:

Route::get('/SearchQuery', 'SearchController@search');

之后打开带搜索框的 blade 模板(我的就是在 layout 里, 我就只截取搜索框的代码了). 这里的 class 大家都可以忽略, 主要就是关注配置表单提交的信息, 还有就是 input 框的 name 一定要是 "search":

<form class="form-inline my-2 my-lg-0" id="elasticScout" action="/SearchQuery" method="get">
<input class="form-control mr-sm-2 form-control-sm" type="search" placeholder="搜索" aria-label="Search" name="search">
<button class="btn btn-outline-secondary btn-sm my-2 my-sm-0" type="submit">搜索</button>
</form>

最后再根据 searchController 里返回的 view, 建一个展示查询结果的 result 页面, 并在页面中把 查询结果循环输出:

@if(!empty($posts))

    @foreach($posts as $post)

        <h1>{{ $post->content }} </h1>

    @endforeach

@endif

终于.....写完了.....
我真的弯弯曲曲走了差不多两天, follow 了好几位前辈的经验, 东拼西凑, 最终总结了一条最适合我自己的路(捂脸笑). 把我参考的前辈的文章也分享一下, just in case for u ~~~~~

这是我看到的最后一篇, 或许是由于有了前面一天的积累, 看到这篇的时候, 我有种豁然开朗的感觉, 所以我后面的主要思路也是参考它的, 之后稍微填了各别小坑:
Basic Search Functionality with ElasticSearch & Laravel Scout

我抄袭了这位前辈的题目, 因为我觉得我想不到更好的(嘻嘻), 但是恕我太白, 我无法完全 follow 他的思路:
Laravel5.5 使用 Elasticsearch 做引擎,scout 全文搜索

还有一篇来自 laravel-china 的, 我从那里学到了要用 ik 分词, 好吧, 我承认我找不到了, 好吧, 我承认我实在不想找了, 闪~~~~

在 Laravel 项目中使用 Elasticsearch 做引擎,scout 全文搜索(小白出品, 绝对白话)的更多相关文章

  1. &lbrack;Laravel-Swagger&rsqb;如何在 Laravel 项目中使用 Swagger

    如何在 Laravel 项目中使用 Swagger http://swagger.io/getting-started/ 安装依赖 swagger-php composer require zirco ...

  2. 【转】在Express项目中使用Handlebars模板引擎

    原文:http://fraserxu.me/2013/09/12/Using-Handlebarsjs-with-Expressjs/ 最近在用Expressjs做一个项目,前后端都用它来完成.自己之 ...

  3. Laravel 项目中使用 Bootstrap 框架

    Laravel 如何引入 Bootstrap 如官方文档所言,Laravel 并不强制你使用 CSS 框架,但是开箱提供了对 Bootstrap 的支持,在 resources/js/bootstra ...

  4. 【spring】在spring cloud项目中使用&commat;ControllerAdvice做自定义异常拦截,无效 解决原因

    之前在spring boot服务中使用@ControllerAdvice做自定义异常拦截,完全没有问题!!! GitHub源码地址: 但是现在在spring cloud中使用@ControllerAd ...

  5. laravel项目中手机浏览器在线阅读pdf文件--&gt&semi;PDFJS插件

    第一步:下载链接:http://mozilla.github.io/pdf.js/getting_started/#download 第二步:将下载的文件放在项目中. 第三步:在项目中想要预览的地方给 ...

  6. &lbrack; Laravel 5&period;5 文档 &rsqb; 官方扩展包 —— 全文搜索解决方案:Laravel Scout

    简介 Laravel Scout 为 Eloquent 模型全文搜索实现提供了简单的.基于驱动的解决方案.通过使用模型观察者,Scout 会自动同步更新模型记录的索引. 目前,Scout 通过 Alg ...

  7. Laravel 项目中编写第一个 Vue 组件

    和 CSS 框架一样,Laravel 不强制你使用什么 JavaScript 客户端框架,但是开箱对 Vue.js 提供了良好的支持,如果你更熟悉 React 的话,也可以将默认的脚手架代码替换成 R ...

  8. laravel项目中通过nvmw安装node&period;js和npm 开发环境-- windows版

    windows版本安装 此教程执行的时候,网速一定要好.不然可能出现各种错误. 如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人.谢谢大家!❤ git clone nvmw  直接从 githu ...

  9. 在Laravel项目中遇到的一些问题

    1. 控制器名字要跟控制器类名保持一致(当保存某个版本的文件时,我通常喜欢复制一份并重命名,这时候重命名的文件的类名并没有改变,着往往回影响结果,却一直找不出错在哪里),在备份的时候应该新建一个文件夹 ...

随机推荐

  1. ORACLE 导空表结构

    exp username/psd@sid file='E:\xx.dmp' tables=(xxx_%) ROWS=N 以下代码没什么用,我就乱写 set oracle_sid=ora11gsqlpl ...

  2. 【转】Eazfuscator&period;NET 3&period;3中混淆化需要注意的一些问题

    对于DLL,Eazfuscator.NET默认不会混淆化任何公共成员,因为类库的公共成员很有可能被外界调用,而对于EXE的程序集,所有类型都可能被混淆化.注意上面这句话有一个“可能”,因为Eazfus ...

  3. js 不可变的原始值和可变的对象引用

    javascript中的原始值(undefined.null.布尔值.数字和字符串)与对象(包括数组和函数)有着根本区别.原始值是不可更改的:任何方法都无法更改(或“突变”)一个原始值.对数字和布尔值 ...

  4. shell中的declare命令

    declare命令有如下选项: -a 声明一个数组 -i 声明一个整型 -f 打印所有函数定义 -F 仅打印函数名字 -r 声明一个readonly变量,该变量的值无法改变,并且不能为unset -x ...

  5. 关于SVN更新注意

    SVN更新时其实大部分都可以直接更新但是只有在 当然为0就没有事但是如果不是0的话就要注意了表示你修改的和别人修改了相同的文件先点开 次文件然后看看那些不一样主要看如果是这样就直接点更新就好了,如果有 ...

  6. 数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

    树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构.    a.树是n ...

  7. bzoj2969 矩形粉刷

    学习一波用markdown写题解的姿势QAQ 题意 给你一个w*h的矩形网格,每次随机选择两个点,将以这两个点为顶点的矩形内部的所有小正方形染黑,问染了k次之后期望有多少个黑色格子. 分析 一开始看错 ...

  8. linux swing 乱码

    转载 Linux下关于解决JavaSwing中文乱码的情况 redhed 貌似没出现乱码 本身就jdk就支持中文 红旗linux  suse等都不支持,需要自己手工配置,解决办法: 第一种方法: 1. ...

  9. 解决升级Nodepad&plus;&plus;都会让插件失效

    主要原因是Plugin Manager失效导致的,需要重新导入 导入一下PluginManager就可以了地址:https://github.com/bruderstein/nppPluginMana ...

  10. 41F继电器座的解剖与妙用

    摘要:如果继电器不是焊在电路板上使用,就需要有个插座,这样方便接线,否则继电器的管脚是没法固定导线的.实际项目中使用了HF41F的继电器(宏发),在选择继电器座的时候,有一点感想,分享给大家.继电器是 ...