小白折腾服务器(十):docker 下安装 Elasticsearch+ik 分词插件
这几天在学习电商进阶的6,7章,就是使用elasticsearch重构搜索的这两章。
作品分享下:
http://120.27.8.8/products?order=price_desc&search=金士顿
http://120.27.8.8/products?search=内存条&filters=传输类型:DDR4|内存容量:8GB
学习笔记和感悟:
- 5.8版本下数据表设置外键时主外键类型必须完全一致
- .env中要修改,否则安装完会报错 “Could not parse URI”
- 除了数据库里要有数据,es中要创建索引,还要给es中添加商品数据
- 文档型数据库和关系型数据库真的不一样,初学觉得还蛮神奇
谢谢谢谢leo老师的这么好的教程和summer大大提供的平台,鞠躬
以下是服务器上使用docker搭建elasticsearch+ik的踩坑笔记
我的服务器是阿里云的ECS,1核2G,系统是Centos7.
nginx+php在服务器本机搭建,mysql+redis使用docker搭建
部署项目使用deployer。
拉取镜像:
// 官方镜像,这步非必须,但是拉取了之后操作会快点
docker pull docker.elastic.co/elasticsearch/elasticsearch:6.5.0
给docker-compose.yml 中增加es
yml文件真的很严格,空格稍微没对齐就报错。
version: '3'
services:
aen233-mysql:
image: mysql:5.7
container_name: aen233-mysql
environment:
MYSQL_ROOT_PASSWORD: 123456
ports:
- "3306:3306"
volumes:
- ./mysql:/var/lib/mysql
networks:
- esnet
aen233-redis:
image: redis:alpine
container_name: aen233-redis
ports:
- "6379:6379"
volumes:
- ./redis:/data
networks:
- esnet
aen233-adminer:
image: adminer
container_name: aen233-adminer
ports:
- "8080:8080"
links:
- aen233-mysql:db
networks:
- esnet
aen233-elasticsearch:
build: .
container_name: aen233-elasticsearch
environment:
- "discovery.type=single-node"
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- http.cors.enabled=true
- http.cors.allow-origin=*
volumes:
- ./esdata:/usr/share/elasticsearch/data
ports:
- "9200:9200"
networks:
- esnet
networks:
esnet:
docker-compose.yml保存后就可以敲命令了
chmod 777 esdata //先给服务器挂载es数据的文件夹(就是docker-compose中elasticsearch下volumes中配的文件夹)加个权限,否则es容器会自动退出
docker-compose up -d
测试一下es,
curl http://127.0.0.1:9200/
如果返回如下就ok啦
{
"name" : "3E1nODN",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "x-H40SveSYqvvAZycOr1bw",
"version" : {
"number" : "6.5.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "816e6f6",
"build_date" : "2018-11-09T18:58:36.352602Z",
"build_snapshot" : false,
"lucene_version" : "7.5.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
这里不是立马就生效,大概要等10s到1min,
curl: (52) Empty reply from server
是稍等一下下就好
curl: (7) Failed to connect to 127.0.0.1 port 9200: Connection refused
是es容器exit了
docker-compose的删除关闭是,docker-compose down
docker ps -a
查看如果es自动退出就 docker-compose down
down了再改 docker-compose.yml
, 改了 up ,容器自动退了就 down
增加ik分词,两条命令
docker-compose exec aen233-elasticsearch elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.5.0/elasticsearch-analysis-ik-6.5.0.zip
//然后要重启es容器
docker-compose restart aen233-elasticsearch
测试一下ik,
// 增加一个叫test001的索引
curl -X PUT http://127.0.0.1:9200/test001
// 笔记1: 返回 "acknowledged":true 才算正常
// 笔记2: 使用pretty=true参数美化返回格式,更易于阅读
curl -X POST \
'http://127.0.0.1:9200/test001/_analyze?pretty=true' \
-H 'Content-Type: application/json' \
-d '{"text":"我们是软件工程师","tokenizer":"ik_smart"}'
如果返回如下就ok啦
{
"tokens" : [
{
"token" : "我们",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "是",
"start_offset" : 2,
"end_offset" : 3,
"type" : "CN_CHAR",
"position" : 1
},
{
"token" : "软件",
"start_offset" : 3,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 2
},
{
"token" : "工程师",
"start_offset" : 5,
"end_offset" : 8,
"type" : "CN_WORD",
"position" : 3
}
]
}
初学小tips:
如果你也是初学,先用最简单的命令测试下能不能跑起来
docker run -d --name aen233-elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms512m -Xmx512m" docker.elastic.co/elasticsearch/elasticsearch:6.5.0
-d 开启daemon模式,后台运行,提供服务
--name 给这个容器起个名字
-p 端口映射,elasticsearch好像9200映射出来就好了
-e 配置环境变量 ES_JAVA_OPTS="-Xms512m -Xmx512m" 给它配一个可用内存限制,防止内存溢出,要不然服务器很容易卡死
然后 docker ps -a
查看所有的容器 ,docker stop 容器id
, docker rm 容器id
关了删了再重来,直到成功
报错踩坑
第一个错:Exited (78) 55 minutes ago
查错:docker-compose logs elasticsearch
解决:sudo sysctl -w vm.max_map_count=262144
但是这个,最好加个"ES_JAVA_OPTS=-Xms512m -Xmx512m"的环境变量,要不然很容易内存溢出
参考链接:github issue:Elasticsearch Container Stopped with 'Exit 78' state in Ubuntu 18.04
第二个错:挂载本地数据 自动退出
查错:权限问题,需要把本地挂载的目录改为777就可以了
解决:chmod 777 esdata
参考链接:Docker ElasticSearch挂载本地数据 报错
第三个错:Dockerfile里给es配ik就报错
结果:未解决,使用docker-compose exec + docker-compose restart 手动安装的ik
[root@aen233 aen233-dnmp]# docker-compose up -d
Creating network "aen233-dnmp_esnet" with the default driver
Building aen233-elasticsearch
Step 1/3 : FROM docker.elastic.co/elasticsearch/elasticsearch:6.5.0
---> ff171d17e77c
Step 2/3 : RUN elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.5.0/elasticsearch-analysis-ik-6.5.0.zip
---> Running in c42cc0c3a221
-> Downloading https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.5.0/elasticsearch-analysis-ik-6.5.0.zip
[=================================================] 100%??
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: plugin requires additional permissions @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
* java.net.SocketPermission * connect,resolve
See http://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html
for descriptions of what these permissions allow and the associated risks.
Exception in thread "main" java.lang.IllegalStateException: unable to read from standard input; is standard input open and a tty attached?
at org.elasticsearch.cli.Terminal$SystemTerminal.readText(Terminal.java:173)
at org.elasticsearch.plugins.PluginSecurity.prompt(PluginSecurity.java:74)
at org.elasticsearch.plugins.PluginSecurity.confirmPolicyExceptions(PluginSecurity.java:67)
at org.elasticsearch.plugins.InstallPluginCommand.installPlugin(InstallPluginCommand.java:801)
at org.elasticsearch.plugins.InstallPluginCommand.install(InstallPluginCommand.java:775)
at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:231)
at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:216)
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86)
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
at org.elasticsearch.cli.MultiCommand.execute(MultiCommand.java:77)
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
at org.elasticsearch.cli.Command.main(Command.java:90)
at org.elasticsearch.plugins.PluginCli.main(PluginCli.java:47)
ERROR: Service 'aen233-elasticsearch' failed to build: The command '/bin/sh -c elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.5.0/elasticsearch-analysis-ik-6.5.0.zip' returned a non-zero code: 1
[root@aen233 aen233-dnmp]#
本作品采用《CC 协议》,转载必须注明作者和本文链接
:+1:
elasticsearch-plugin install -b http://.... 可以直接安装
怎么手动安装,我下载分词器解压到plugins启动不了