PHP站内搜索功能(laravel自带Scout驱动+elasticsearch)

站内搜索

由于最近做的网站需要用到网站的站内搜索,我也是偷偷摸摸学了一手,希望有需要的朋友也可以看看
搜索引擎 Elasticsearch 官方网站 https://www.elastic.co/cn/

原理:输入内容与内存中的想匹配找到对应的文档输出 Elasticsearch的中文支持主要依靠medcl
Elasticsearch 基本概念 索引
服务器地址 端口
index: 索引名称
type: 索引类型名称
document:索引文档
field 字段
template: 模板

了解了这些基本之后

1.Elasticsearch安装和IK插件

Elasticsearch 安装集成包 https://github.com/medcl/elasticsearch-rtf
1.下载zip文件
2.解压安装bin下的elasticsearch.bat
这里坑很多小编也是被折腾了一个晚上,最后重新下载了elasticsearch

首先要安装JDK1.8并配置好java环境

其次是安装 进入elasticsearch的bin 目录下 elasticsearch.bat 安装

这里不知道为什么小编安装的失败的经过了,百度了很多最终无果在我尝试重新找了个安装
https://pan.baidu.com/s/1pJNkrUV

安装好以后启动elasticsearch binelasticsearch -d

接着打开http://localhost:9200/

如果出现这个 那么恭喜你已经安装成功了
如果电脑内存小的只保留plugin目录下的IK插件

2.Elasticsearch的laravel scout宝安装

https://laravel.com/docs/5.6/scout
在安装laravel框架下composer require laravel/scout
配置app 文件 LaravelScoutScoutServiceProvider::class
安装插件 composer require tamayo/laravel-scout-elastic
安装完成以后app.php添加ScoutEnginesElasticsearchElasticsearchProvider::class

修改配置文件scout 选择elasticsearch搜索引擎
增加索引驱动

根据自己的索引和端口进行配置index和hosts

3.创建ylaravel的索引和模板

创建command php artisan make:command ESInit

配置ESInit 修改命令启动脚本以及描述

在appConsoleKernel.php中挂载
接下来在php artisan 中就会发现有es的脚本启动命令那就说明创建成功了
引入guzzlehtpp composer require guzzlehttp/guzzle
在向handle 中创建template

$client = new Client(); $url = config('scout.elasticsearch.hosts')[0] . '/_template/tmp'; $client->delete($url); $param = [ 'json'=>[ 'template' =>config('scout.elasticsearch.index'), 'mappings' =>[ '_default' =>[ 'dynamic_templates'=>[ [ 'string'=>[ 'match_mapping_type' =>'string', 'mapping' => [ 'type'=>'text', 'analyzer' => 'ik_smart', 'fields'=>[ 'keyword'=>[ 'type' =>'keyword' ] ] ] ] ] ] ] ] ], ]; $client->put($url,$param); $this->info("=======创建模板成功============="); //创建index $url =config('scout.elasticsearch.hosts')[0].'/'.config('scout.elasticsearch.index'); //$client->delete($url); $param = [ 'json'=>[ 'settings'=>[ 'refresh_interval' =>'5s', 'number_of_shards' =>1, 'number_of_replicas' =>0, ], 'mappings'=>[ '_default_' =>[ '_all' =>[ 'enabled'=>false ] ] ] ] ]; $client->put($url,$param); $this->info("=======创建索引成功=============");

4.导入数据库

修改模型
首先 引入laravel的scout并定义索引类型和字段
下面是模型下的相关操作根据自己的需要修改

$this->work_name, 'work_content'=>$this->work_content, ]; }}

接下来就是将所要搜索数据库的表导入

可以看到我已经成功引入了我的数据最大的ID是20

让我们检测一下work 20

随后博主也是测试了数据库的更新 我们可以看到数据库更新了以后 laravel自动把数据加到了索引之中
也是醉了为什么数据库都更新了就更新不了这里博主也是碰到了一个坑,花了一大晚上
之前博主写的东西是用insert()方法插入到数据中的 而Scout驱动自动将数据更新到索引中必须要使用新建模型的方法

看到这里我才恍然大悟,接着我便在我的控制器中重新写了方法

创建好实例,接着写入保存的方法即可
测试了下我数据是否实时更新,发现删除添加数据Scout都将我的数据自动更新到索引
接下来我们就可以写搜索的方法了

5.搜索页面编写逻辑

首先我们要创建一个route来获取搜索的页面
接下来写入控制器方法

接下来在页面中返回数据 页面填充数据即可


其间又让博主头疼一开始搜索的词太过骚气,导致搜索无果也是坑了我很久,对这个IK的分词的配置也不是很了解,导致IK的强大的中文分词没体现出来,但总的来说你搜索正常的单词 都可以搜索的结果。如果小伙伴们做到这一步那么恭喜你已经成功了,要想要更强大的搜索功能还得继续努力
后续补充!!!!!!
想要更精确的分词搜索功能只需选择ik_max_word来代替ik_smart
ik_max_word:会将文本做最细粒度的拆分,例如「中华人民共和国国歌」会被拆分为「中华人民共和国、中华人民、中华、华人、人民共和国、人民、人、民、共和国、共和、和、国国、国歌」,会穷尽各种可能的组合;
ik_smart:会将文本做最粗粒度的拆分,例如「中华人民共和国国歌」会被拆分为「中华人民共和国、国歌」;
注意注意!!!!!正所谓一到线上各种问题,由于凑巧原因我的第一次安装JAVA环境非常的好。elasticsearch的坑是真的多,博主的头都快被锤烂了.为了防止小伙伴重蹈我的覆辙请注意下面的说明:安装jdk的时候千万不要装默认尤其是文件名带有空格符 elastsearch将不会识别导致你找不到启动不了elasticsearch 这个坑也是没谁了,查看java环境和配置毫无问题就是找不到javahome,弄得博主是真的绝望

弱势博主,求关注

个人博客

更多前端技术文章美术设计wordpress插件、优化教程学习笔记尽在我的个人博客喵容 - 和你一起描绘生活,欢迎一起交流学习,一起进步:https://www.miaoroom.com

站内文章推荐:

「2018年前端面试知识点」最新汇总

超级好用的开发工具,程序员实用工具整理

收集优质的中文前端博客(不定期更新中)

站内搜索功能(laravel自带Scout驱动+elasticsearch)

vue中Axios的封装和API接口的管理

参与评论