持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第28天,点击查看活动详情
前言
昨天的文章中,优化了redis的存储结构,简化了首页展示接口的逻辑,而对于节点查询,服务应该支持模糊查询,但是对于不同节点标签不同,如有company,product与cev_number,查询的时候这些如果是一个传递的参数,好像对于查询来说不太友好,两个解决思路,一个是neo4j的模糊查询能否不指定节点label,另外就是做一个查询推荐的,类似于字典树,然后在redis存储对应关键字的label,构造模糊查询语句。或者使用ES数据库的suggest语句。
ES
docker 安装ES
之前redis、mysql都是通过docker部署的,因此ES也通过docker 进行部署,如下:
docker pull elasticsearch:7.7.0
查看docker镜像
docker image list
docker es 启动
docker run --name elasticsearch -d -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -e "discovery.type=single-node" -p 9200:9200 -p 9300:9300 elasticsearch:7.7.0
#--name表示镜像启动后的容器名称
#-d: 后台运行容器,并返回容器ID;
#-e: 指定容器内的环境变量
#-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
因此使用本地19200端口映射9200端口
报错如下:
docker: Error response from daemon: driver failed programming external connectivity on endpoint elasticsearch (f7277816b366ed5e52cb06e93beeb1c733c284f3df6b0120bceee726be723293): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9300 -j DNAT --to-destination 172.17.0.4:9300 ! -i docker0: iptables: No chain/target/match by that name.
原因是我们打开了防火墙后又关闭了,我们只需要将其重启docker容器即可解决该问题
systemctl restart docker
查看正在运行的机器
docker ps
查看ES服务是否正常:
curl 0.0.0.0:9200
{
"name" : "b182fea9c5fa",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "_vhIru-CQrOHq7W8zn1tlQ",
"version" : {
"number" : "7.7.0",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "81a1e9eda8e6183f5237786246f6dced26a10eaf",
"build_date" : "2020-05-12T02:01:37.602180Z",
"build_snapshot" : false,
"lucene_version" : "8.5.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
测试本地隧道是否打通:
安装分词器
进入ES容器
docker exec -it b182fea9c5fa /bin/bash
ls
cd /bin
下载分词器
https://github.com/medcl/elasticsearch-analysis-ik/releases?q=7.7.0&expanded=true
下载之后放入容器中:
docker cp elasticsearch-analysis-ik-7.7.0.zip b182fea9c5fa:/usr/share/elasticsearch
解压缩至plugins/ik
unzip elasticsearch-analysis-ik-7.7.0.zip
重启docker es服务
docker restart b182fea9c5fa
这样建立带有分词器的索引就不会报错了