最近爬了某图片站14W+数据,正准备做个图片搜索服务。
使用Laravel,Es搜索引擎,坑太多了专门写篇文章记录一下!!
注:我的所有环境均使用docker搭建!
一、安装Elastsearch镜像
这里我安装的es镜像版本是6.8.6
坑一:这里提醒一下,因为我用到了IK分词。如果需要使用一些es的插件,请提前知晓该插件支持的es版本!我就是在遇到插件和es版本对不上 导致很多错误!
docker pull elasticsearch:6.8.6
docker版es的tag可以去这里查:https://hub.docker.com/_/elasticsearch?tab=tags
启动 es容器
docker run -d -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -e "discovery.type=single-node" --name es elasticsearch:6.8.6
本机这里我限制了es的使用内存为512M,并设置es为单例模式single-node。
接下来在浏览器里面访问http://127.0.0.1:9200
看到数据返回:
{
name: "CAOQXSj",
cluster_name: "docker-cluster",
cluster_uuid: "pMS_zrN7Q0Wvlbb26DmHXA",
version: {
number: "6.8.6",
build_flavor: "default",
build_type: "docker",
build_hash: "3d9f765",
build_date: "2019-12-13T17:11:52.013738Z",
build_snapshot: false,
lucene_version: "7.7.2",
minimum_wire_compatibility_version: "5.6.0",
minimum_index_compatibility_version: "5.0.0"
},
tagline: "You Know, for Search"
}
二、安装Elastsearch-head镜像
elastsearch-head是es服务的一个可视化工具,可以更方便直观的帮助我们调试数据。
docker pull mobz/elasticsearch-head:5
启动es-head
docker run -d -p 9100:9100 --name eshead mobz/elasticsearch-head:5
进入es的bash交互界面,开启一下跨域访问权限,才能使es-head对接上数据
docker exec -ti es /bin/bash
进入config目录,找到elasticsearch.yml 编辑它vim命令 如果没有vim命令就执行apt-
增加如下两行,让es-head可以访问
http.cors.enabled: true
http.cors.allow-origin: "*"
保存后输入exit退出交互界面。
重启es容器
docker restart es
坑二:es-head版本过老,内置的http请求方式被es拒绝,所以你得按下面的链接配置一下es-head
https://blog.csdn.net/wangxilong1991/article/details/80618273
三、安装Ik分词器
地址:https://github.com/medcl/elasticsearch-analysis-ik
先进入es的bash交互界面
docker exec -ti es /bin/bash
然后cd plugins目录。
创建一个文件夹 mkdir ik
然后使用wget命令下载ik分词器插件(最好选择和你es版本一样,不然各种错误)
这里我是6.8.6
[root@7ce479a44bf4 plugins]# wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.6/elasticsearch-analysis-ik-6.8.6.zip
解压到ik目录
unzip elasticsearch-analysis-ik-6.8.6.zip -d ik/
然后删除elasticsearch-analysis-ik-6.8.6.zip压缩包
退出bash界面,重启es服务
四、为laravel安装elasticsearch扩展包
具体教程可以参考这篇文章:https://learnku.com/articles/20311
我只是说说里面的一些注意的点:
1.不用先安装scout,直接安装tamayo/laravel-scout-elastic这个包,他会自动将自己所需的依赖包scout安装,
不然容易出现一些版本冲突的玄学问题
2.docker里面的php访问docker里面的es可能会出现找不到ip,这时候将laravel的env配置es服务地址改为host.docker.internal
如下图所示:
3.导入数据之前请新建索引,不然直接scout:import导入的数据无法使用ik分词
具体参考:https://learnku.com/articles/4027
4.tamayo/laravel-scout-elastic这个包有个bug,会默认在搜索关键字前后加上星号*,会导致中文分词失效!
需要手动改一下源代码。
在/vendor/tamayo/laravel-scout-elastic/ElasticsearchEngine.php
第140行,把:
'must' => [['query_string' => [ 'query' => "*{$builder->query}*"]]]
左右两边的星号去掉,变为:
'must' => [['query_string' => [ 'query' => "{$builder->query}"]]]
good