小白折腾服务器(十):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

学习笔记和感悟:

  1. 5.8版本下数据表设置外键时主外键类型必须完全一致
  2. .env中要修改,否则安装完会报错 “Could not parse URI”
  3. 除了数据库里要有数据,es中要创建索引,还要给es中添加商品数据
  4. 文档型数据库和关系型数据库真的不一样,初学觉得还蛮神奇

谢谢谢谢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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3

elasticsearch-plugin install -b http://.... 可以直接安装

5年前 评论

怎么手动安装,我下载分词器解压到plugins启动不了

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
php @ abc
文章
20
粉丝
94
喜欢
198
收藏
232
排名:106
访问:8.9 万
私信
所有博文
社区赞助商