设置为:3072的,就是2G
然后重启虚拟机
集群部署结构
在一台服务器上,使用Docker部署三个ES容器组成的集群
准备虚拟网络和挂载目录
# 创建虚拟网络docker network create es-net# node1 的挂载目录mkdir -p -m 777 /var/lib/es/node1/pluginsmkdir -p -m 777 /var/lib/es/node1/data# node2 的挂载目录mkdir -p -m 777 /var/lib/es/node2/pluginsmkdir -p -m 777 /var/lib/es/node2/data# node3 的挂载目录mkdir -p -m 777 /var/lib/es/node3/pluginsmkdir -p -m 777 /var/lib/es/node3/data
设置 max_map_count
必须修改系统参数max_map_count
,否则 Elasticsearch 无法启动:
在/etc/sysctl.conf
文件中添加vm.max_map_count=262144
echo 'vm.max_map_count=262144' >>/etc/sysctl.conf
需要重启服务器!
如图
确认参数配置:
cat /etc/sysctl.conf
操作效果
启动 Elasticsearch 集群
node1:
docker run -d \--name=node1 \--restart=always \--net es-net \-p 9200:9200 \-p 9300:9300 \-v /var/lib/es/node1/plugins:/usr/share/elasticsearch/plugins \-v /var/lib/es/node1/data:/usr/share/elasticsearch/data \-e node.name=node1 \-e node.master=true \-e network.host=node1 \-e discovery.seed_hosts=node1,node2,node3 \-e cluster.initial_master_nodes=node1 \-e cluster.name=es-cluster \-e "ES_JAVA_OPTS=-Xms256m -Xmx256m" \elasticsearch:7.9.3
node2:
docker run -d \--name=node2 \--restart=always \--net es-net \-p 9201:9200 \-p 9301:9300 \-v /var/lib/es/node2/plugins:/usr/share/elasticsearch/plugins \-v /var/lib/es/node2/data:/usr/share/elasticsearch/data \-e node.name=node2 \-e node.master=true \-e network.host=node2 \-e discovery.seed_hosts=node1,node2,node3 \-e cluster.initial_master_nodes=node1 \-e cluster.name=es-cluster \-e "ES_JAVA_OPTS=-Xms256m -Xmx256m" \elasticsearch:7.9.3
node3:
docker run -d \--name=node3 \--restart=always \--net es-net \-p 9202:9200 \-p 9302:9300 \-v /var/lib/es/node3/plugins:/usr/share/elasticsearch/plugins \-v /var/lib/es/node3/data:/usr/share/elasticsearch/data \-e node.name=node3 \-e node.master=true \-e network.host=node3 \-e discovery.seed_hosts=node1,node2,node3 \-e cluster.initial_master_nodes=node1 \-e cluster.name=es-cluster \-e "ES_JAVA_OPTS=-Xms256m -Xmx256m" \elasticsearch:7.9.3
环境变量说明:
参考Networking | Elasticsearch Guide [7.15] | Elastic
操作效果
其中9200就相当于3066一样
9300就是es之间的连接的端口
查看启动结果结果
http://192.168.64.181:9200
http://192.168.64.181:9200/_cat/nodes
chrome浏览器插件:elasticsearch-head
elasticsearch-head 项目提供了一个直观的界面,可以很方便地查看集群、分片、数据等等。elasticsearch-head最简单的安装方式是作为 chrome 浏览器插件进行安装。
然后在谷歌浏览里选择:
里面选择:更多工具->拓展程序
然后选择上一张截图里的解压文件
安装 ik 分词器
从 ik 分词器项目仓库中下载 ik 分词器安装包,下载的版本需要与 Elasticsearch 版本匹配:
/medcl/elasticsearch-analysis-ik
或者可以访问 gitee 镜像仓库:
/mirrors/elasticsearch-analysis-ik
下载 elasticsearch-analysis-ik-7.9.3.zip 复制到 /root/ 目录下
在三个节点上安装 ik 分词器:
cd ~/# 复制 ik 分词器到三个 es 容器docker cp elasticsearch-analysis-ik-7.9.3.zip node1:/root/docker cp elasticsearch-analysis-ik-7.9.3.zip node2:/root/docker cp elasticsearch-analysis-ik-7.9.3.zip node3:/root/# 在 node1 中安装 ik 分词器docker exec -it node1 elasticsearch-plugin install file:///root/elasticsearch-analysis-ik-7.9.3.zip# 在 node2 中安装 ik 分词器docker exec -it node2 elasticsearch-plugin install file:///root/elasticsearch-analysis-ik-7.9.3.zip# 在 node3 中安装 ik 分词器docker exec -it node3 elasticsearch-plugin install file:///root/elasticsearch-analysis-ik-7.9.3.zip# 重启三个 es 容器docker restart node1 node2 node3
操作效果:
ik_max_word
分词测试
使用 head 执行下面测试:
向http://192.168.64.181:9200/_analyze
路径提交POST
请求,并在协议体中提交 Json 数据:
{"analyzer":"ik_max_word","text":"中华人民共和国国歌"}
创建索引
创建一个名为 products 的索引,用来存储商品数据。
分片和副本参数说明:
number_of_shards:分片数量,默认值是 5
number_of_replicas:副本数量,默认值是 1
我们有三个节点,在每个节点上都创建一个分片。每个分片在另两个节点上各创建一个副本。
# 创建索引,命名为 productsPUT /products{"settings": {"number_of_shards": 3, "number_of_replicas": 2}}
网址打开比较慢,很正常,如果网速不好,打开是比较慢可以多等一下!
下图则表示成功:
粗框为主分片,细框为副本分片
映射(数据结构)
类似于数据库表结构,索引数据也被分为多个数据字段,并且需要设置数据类型和其他属性。
映射,是对索引中字段结构的定义和描述。
字段的数据类型
常用类型:
数字类型:
byte、short、integer、long
float、double
unsigned_long
字符串类型:
text : 会进行分词
keyword : 不会进行分词,适用于email、主机地址、邮编等
日期和时间类型:
date
类型参考:
https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html
创建映射
在 products 索引中创建映射。
分词器设置:
analyzer:在索引中添加文档时,text类型通过指定的分词器分词后,再插入倒排索引
search_analyzer:使用关键词检索时,使用指定的分词器对关键词进行分词
查询时,关键词优先使用 search_analyzer 设置的分词器,如果 search_analyzer 不存在则使用 analyzer 分词器。
# 定义mapping,数据结构PUT /products/_mapping{"properties": {"id": {"type": "long"},"title": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"},"category": {"type": "text","analyzer": "ik_smart","search_analyzer": "ik_smart"},"price": {"type": "float"},"city": {"type": "text","analyzer": "ik_smart","search_analyzer": "ik_smart"},"barcode": {"type": "keyword"}}}
等网页打开,如果网太慢了,那么打开是慢一点,等一下
操作效果:
查看映射
GET /products/_mapping
添加文档
添加的文档会有一个名为_id
的文档id,这个文档id可以自动生成,也可以手动指定,通常可以使用数据的id作为文档id。
# 添加文档PUT /products/_doc/10033{"id":"10033","title":"SONOS PLAY:5(gen2) 新一代PLAY:5无线智能音响系统 WiFi音箱家庭,潮酷数码会场","category":"潮酷数码会场","price":"3980.01","city":"上海","barcode":"527848718459"}PUT /products/_doc/10034{"id":"10034","title":"天猫魔盒 M13网络电视机顶盒 高清电视盒子wifi 64位硬盘播放器","category":"潮酷数码会场","price":"398.00","city":"浙江杭州","barcode":"522994634119"}PUT /products/_doc/10035{"id":"10035","title":"BOSE SoundSport耳塞式运动耳机 重低音入耳式防脱降噪音乐耳机","category":"潮酷数码会场","price":"860.00","city":"浙江杭州","barcode":"526558749068"}PUT /products/_doc/10036{"id":"10036","title":"【送支架】Beats studio Wireless 2.0无线蓝牙录音师头戴式耳机","category":"潮酷数码会场","price":"2889.00","city":"上海","barcode":"37147009748"}PUT /products/_doc/10037{"id":"10037","title":"SONOS PLAY:1无线智能音响系统 美国原创WiFi连接 家庭桌面音箱","category":"潮酷数码会场","price":"1580.01","city":"上海","barcode":"527783392239"}
也可以自动生成_id
值:
POST /products/_doc{"id":"10027","title":"vivo X9前置双摄全网通4G美颜自拍超薄智能手机大屏vivox9","category":"手机会场","price":"2798.00","city":"广东东莞","barcode":"541396973568"}
查看文档:
GET /products/_doc/10037
查看指定文档title字段的分词结果:
GET /products/_doc/10037/_termvectors?fields=title
修改文档
底层索引数据无法修改,修改数据实际上是先删除再重新添加。
两种修改方式:
PUT:对文档进行完整的替换POST:可以修改一部分字段
修改价格字段的值:
# 修改文档 - 替换PUT /products/_doc/10037{"id":"10037","title":"SONOS PLAY:1无线智能音响系统 美国原创WiFi连接 家庭桌面音箱","category":"潮酷数码会场","price":"9999.99","city":"上海","barcode":"527783392239"}
查看文档:
GET /products/_doc/10037
修改价格和城市字段的值:
# 修改文档 - 更新部分字段POST /products/_update/10037{"doc": {"price":"8888.88","city":"深圳"}}
查看文档:
GET /products/_doc/10037
删除文档
DELETE /products/_doc/10037
清空
POST /products/_delete_by_query{"query": {"match_all": {}}}
删除索引
# 删除 products 索引DELETE /products
# 删除 products 索引
DELETE /products
可以尝试用不同的分片和副本值来重新创建 products 索引
Elasticsearch(四)搜索
导入测试数据
为了测试搜索功能,我们首先导入测试数据,3160条商品数据,数据样例如下:
{ "index": {"_index": "pditems", "_id": "536563"}}{ "id":"536563","brand":"联想","title":"联想(Lenovo)小新Air13 Pro 13.3英寸14.8mm超轻薄笔记本电脑","sell_point":"清仓!仅北京,武汉仓有货!","price":"6688.0","barcode":"","image":"/images/server/images/portal/air13/little4.jpg","cid":"163","status":"1","created":"-03-08 21:33:18","updated":"-04-11 20:38:38"}
下载测试数据
Elasticsearch测试数据,3160条商品数据_elasticsearch商品属性-Java文档类资源-CSDN下载
将压缩文件中的pditems.json
上传到服务器
创建索引和映射
PUT /pditems{"settings": {"number_of_shards": 3, "number_of_replicas": 2},"mappings": {"properties": {"id": {"type": "long"},"brand": {"type": "text","analyzer": "ik_smart"},"title": {"type": "text","analyzer": "ik_max_word"},"sell_point": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"},"price": {"type": "float"},"image": {"type": "keyword"},"cid": {"type": "long"},"status": {"type": "byte"},"created": {"type": "date","format": "yyyy-MM-dd HH:mm:ss"},"updated": {"type": "date","format": "yyyy-MM-dd HH:mm:ss"}} }}
操作效果如下:
用 head 查看索引:
导入数据
在服务器上,进入pditems.json
所在的文件夹,执行批量数据导入:
curl -XPOST 'localhost:9200/pditems/_bulk' \-H 'Content-Type:application/json' \--data-binary @pditems.json
执行效果图
查看数据
搜索pditems
索引中全部 3160 条数据:
GET /pditems/_search{"query": {"match_all": {}},"size": 3160}
查询效果:
也可以在Elasticsearch里测试:
搜索文档
搜索所有数据
# 搜索 pditems 索引中全部数据POST /pditems/_search{"query": {"match_all": {}}}
关键词搜索
# 查询 pditems 索引中title中包含"电脑"的商品POST /pditems/_search{"query": {"match": {"title": "电脑"}}}
操作效果:
搜索结果过滤器:
# 价格大于2000,并且title中包含"电脑"的商品POST /pditems/_search{"query": {"bool": {"must": [{"match": {"title": "电脑"}}],"filter": [{"range": {"price": {"gte": "2000"}}}]}}}
操作效果如图:
搜索结果高亮显示:
POST /pditems/_search{"query": {"multi_match":{"query": "手机","fields": ["title", "sell_point"]}},"highlight" : {"pre_tags" : ["<i class=\"highlight\">"],"post_tags" : ["</i>"],"fields" : {"title" : {},"sell_point" : {"pre_tags": "<em>","post_tags": "</em>"}}}}
Elasticsearch Spring Data Elasticsearch - 增删改查API
Spring Data Elasticsearch
https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#reference
Spring Data Elasticsearch 是 Elasticsearch 搜索引擎开发的解决方案。它提供:
模板对象,用于存储、搜索、排序文档和构建聚合的高级API。
例如,Repository 使开发者能够通过定义具有自定义方法名称的接口来表达查询。
案例说明
在 Elasticsearch 中存储学生数据,并对学生数据进行搜索测试。
数据结构:
案例测试以下数据操作:
创建 students 索引和映射C - 创建学生数据R - 访问学生数据U - 修改学生数据D - 删除学生数据使用 Repository 和 Criteria 搜索学生数据
在 Elasticsearch 中创建 students 索引
在开始运行测试之前,在 Elasticsearch 中先创建 students 索引:
PUT /students{"settings": {"number_of_shards": 3,"number_of_replicas": 2,"index.max_ngram_diff":30,"analysis": {"analyzer": {"ngram_analyzer": {"tokenizer": "ngram_tokenizer"}},"tokenizer": {"ngram_tokenizer": {"type": "ngram","min_gram": 1,"max_gram": 30,"token_chars": ["letter","digit"]}}}},"mappings": {"properties": {"id": {"type": "long"},"name": {"type": "text","analyzer": "ngram_analyzer"},"gender": {"type": "keyword"},"birthDate": {"type": "date","format": "yyyy-MM-dd"}}}}
操作效果如图:
Elasticsearch docker中搭建ES服务集群 ik中文分词器 使用Kibana操作ES 搜索 spring Data Elasticsearch-增删改查API