文章目录
1. 安装启动Kibana
1.1 下载Kibana镜像
docker pull kibana:7.9.3
注意: Kibana版本最好与Elasticsearch版本一致
1.2 启动Kibana镜像
docker run \
-d \
--name kibana \
--net es-net \
-p 5601:5601 \
-e ELASTICSEARCH_HOSTS='["http://node1:9200","http://node2:9200","http://node3:9200"]' \
--restart=always \
kibana:7.9.3
参数:
-e ELASTICSEARCH_HOSTS
=’[“http://node1:9200”,“http://node2:9200”,“http://node3:9200”]’
设置Kibana连接ES的地址, 这里直接通过node1, 容器名称连接虚拟网络
1.3 访问Kibana
地址: http://192.168.126.130:5601
进入Dev Tools操作ES
2. ES索引,分片,副本
2.1 索引
Elasticsearch索引用来存储我们要搜索的数据,以倒排索引结构进行存储。
正向索引: 通过key查询value的值
倒排索引: 通过value查询key, 也叫反向索引
所以ES搜索数据是通过部分内容获取进行搜索的
例如: 建立一个商品索引, 把所有的商品信息都存入这个索引中, 供我们搜索
2.2 分片
当一个索引中存放了大量数据, 就会造成性能下降, 这时我们就需要对数据进行分片存储
每个节点都创建一个索引, 将数据分散到不同的节点上的索引分片中存储, 提高性能
每个分片都是一个独立的索引,数据分散存放在多个分片中,也就是说,每个分片中存储的都是不同的数据。搜索时会同时搜索多个分片,并将搜索结果进行汇总。
2.3 副本
分片后, 每个数据存放在不同的分片中, 但是如果其中一个宕机, 那么里面的数据就无法搜索了
所以需要对分片创建多个副本来解决
即使其中一个服务宕机, 那么 其他服务中的副本还可以继续工作, 不会造成数据不可搜索
分片副本的工作机制:
- 主分片的数据会复制到副本分片
- 搜索时,以负载均衡的方式工作,提高处理能力
- 主分片宕机时,其中一个副本分片会自动提升为主分片
2.4 创建索引
创建一个名为 products 的索引,用来存储商品数据。
# 创建索引,命名为 products
PUT /products
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
}
}
参数说明:
- number_of_shards: 索引分片(默认5)
- number_of_replicas: 分片副本(默认1)
这里节点3个, 每个节点都创建一个索引分片, 每个分片在另外两个节点创建副本
通过索引过滤查看products索引
粗框为主分片,细框为副本分片
3.映射(数据结构)
类似于数据库表结构,索引数据也被分为多个数据字段,并且需要设置数据类型和其他属性。
映射,是对索引中字段结构的定义和描述。
3.1 字段的数据类型
常用类型:
1. 数字类型:
- byte、short、integer、long
- float、double
- unsigned_long
2.字符串类型:
- text : 会进行分词
- keyword : 不会进行分词,适用于email、主机地址、邮编等
3. 日期和时间类型:
- date
3.2 创建映射-Kibana中
在 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
3.3 添加文档
每个文档会有一个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"
}
# 自动生成id
POST /products/_doc
{
"id":"10027",
"title":"vivo X9前置双摄全网通4G美颜自拍超薄智能手机大屏vivox9",
"category":"手机会场",
"price":"2798.00",
"city":"广东东莞",
"barcode":"541396973568"
}
查看文档
GET /products/_doc/10033
查看指定文档title字段的分词结果:
GET /products/_doc/10033/_termvectors?fields=title
3.4 修改文档
底层索引数据无法修改,修改数据实际上是先删除再重新添加。
两种修改的方式:
- PUT 修改所有数据(相当于覆盖)
# 修改文档 - 替换
PUT /products/_doc/10033
{
"id":"10037",
"title":"SONOS PLAY:1无线智能音响系统 美国原创WiFi连接 家庭桌面音箱",
"category":"潮酷数码会场",
"price":"9999.99",
"city":"上海",
"barcode":"527783392239"
}
- POST 修改部分字段
语法: 索引/_update/id
# 修改文档 - 更新部分字段
POST /products/_update/10033
{
"doc": {
"price":"8888.88",
"city":"深圳"
}
}
3.5 删除文档
- 通过id删除
DELETE /products/_doc/10033
- 删除所有文档
POST /products/_delete_by_query
{
"query": {
"match_all": {}
}
}
3.6 删除索引
DELETE /products
4. 搜索文档
4.1 查看数据
搜索 pditems 索引中10条数据:
GET /pditems/_search
{
"query": {
"match_all": {}
},
"size": 100
}
4.2 搜索文档
1. 搜索所有数据
# 搜索 pditems 索引中全部数据
POST /pditems/_search
{
"query": {
"match_all": {}
}
}
2.关键词搜索
# 查询 pditems 索引中title中包含"电脑"的商品
POST /pditems/_search
{
"query": {
"match": {
"title": "电脑"
}
}
}
3.过滤器搜索
# 价格大于2000,并且title中包含"电脑"的商品
POST /pditems/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"title": "电脑"
}
}
],
"filter": [
{
"range": {
"price": {
"gte": "2000"
}
}
}
]
}
}
}
4.搜索结果高亮显示
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>"
}
}
}
}