可视化工具https://gitee.com/qiaoshengda/es-client/releases
什么是ElasticSearch?
ES 是一个开源的分布式搜索引擎,可以来实现搜索、日志统计、分析、系统监控;
ES易于扩展,可以轻松扩展到上百台服务器,处理PB(1PB=1024TB 1TB=1024GB)级别的数据;
ES自身携带分布式协调管理功能,但仅支持json文件格式。
ES理论:
1.索引:
在ES中一个索引对应一组相关文档的存储单元,可以被看作是一种类似于数据库中的表结构,用于存储相类似的文档 每个文档都属于一个索引 索引中的文档用来被搜索和分析。
2.索引分片:
索引分片是将一个完整的索引分成多个的过程,每个分片本身就是一个独立的索引,拥有自己的设置 映射 文档。ES通过将索引划分为多个分片来允许大规模数据存储,并且能够水平扩展,每个分片可以分布在集群的不同节点上,默认情况下每个索引包含五个主分片。
3.索引副本:
索引副本是每个分片的一个复制品,用于提供冗余和故障的恢复,副本分布在不同的节点上 从而增加了系统的可靠性和容错能力。
ElasticSearch核心概念:
1、节点:
节点是集群中的单个服务器,用于存储数据并参与集群的索引和搜索功能,每一个节点都有自己的名称和唯一标识符。
2、集群:
集群是由一个或多个节点组成的一组服务器,它们共同储存项目的整个数据,集群提供了高可用性和横向扩展性。
3、分片和复制:
分片是将索引中的数据分割成多个部分,用于提高性能和扩展性,每个分片可以被存储在集群中的一个或多个 节点上。
复制是为了数据的高可用性和容错性,每个分片都会有一个或多个副本分片,这些分片会被存储窄不同的节点上。
*4、索引:
索引是用于存储数据的地方,类似于关系型数据库中的数据库,他是一种用于存储相似性质的文档的数据结构。
5、类型:
类型在ES6.0之前用于组织索引内部文档的一种方式,在ES7.0版本之后已经被废弃,推荐使用单一索引多字段代替。
6、文档:
文档是ES中的基本数据单元,类似于关系型数据库中的行,每个文档都是一个JSON对象,它们被存储在索引中并可以被搜索。
7、字段:
字段是ES中 文档的组成部分,类似于关系型数据库中的列,每个字段都有自己的数据类型(比如文本类型,数值型等),并且包含特定的数据。
8、映射:
映射定义了索引中的每个字段的数据类型和属性,它相当于关系型数据库中的模式,告诉ES如何处理索引的每一个字段。
安装:
安装elasticsearch:
通过docker 下载 elasticsearch镜像(version>7.12.1):
docker pull elasticsearch:7.12.1 //下载elasticsearch
创建elasticsearch网络:
docker network create es-network
在 usr 下 创建 es 文件夹,并在es文件夹下创建config、data、plugins 文件夹、再在config 下创建 elasticsearch.yml:
mkdir es
cd es
mkdir config
mkdir data
mkdir plugins
cd config
touch elasticsearch.yml
修改es文件权限方便操作:
chmod -R 777 es
运行elasticsearch的镜像,创建容器:
docker run -d \
--name elasticsearch \
--net=es-network \
-p 9200:9200 \
-p 9300:9300 \
-e "discovery.type=single-node" \
-e xpack.security.authc.api_key.enabled=true \
-e "ES_JAVA_OPTS=-Xms50m -Xmx512m" \
-v es-data:/usr/elasticsearch/data \
-v es-plugins:/usr/elasticsearch/plugins \
docker.elastic.co/elasticsearch/elasticsearch:7.12.1
docker run -d \ # 后台运行
--name elasticsearch \ #给容器起一个别名
--net=es-network \ #指定容器连接到名为es-network 的网络上面
-p 9200:9200 \ #主机和容器之间的端口映射,9200用于程序调用使用
-p 9300:9300 \ #主机和容器之间的端口映射,9300用于程序调用通信
-e "discovery.type=single-node" \ #配置单节点启动发现的环境变量
-e xpack.security.authc.api_key.enabled=true \ #启动api秘钥认证功能
-e "ES_JAVA_OPTS=-Xms50m -Xmx512m" \ #指定java虚拟机最小堆内存 和最大堆内存
-v es-data:/usr/elasticsearch/data \ #挂载数据目录卷
-v es-plugins:/usr/elasticsearch/plugins \ #挂载插件目录卷
docker.elastic.co/elasticsearch/elasticsearch:7.12.1 指定运行镜像:版本
安装成功的校验:
设置访问密码:
1、进入容器找到 /usr/share/elasticsearch/config
2、通过vi 编辑 elasticsearch.yml 文件
cluster.name: "docker-cluster"
network.host: 0.0.0.0http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
3、退出重启容器,再进入容器:
4、输入以下命令重置密码:
./bin/elasticsearch-setup-passwords interactive
5、再次退出重启容器,再进入容器:
6、在浏览器访问 服务器IP:9200
7、出现该页面表示安装ES成功:
输入账号:elastic
密码:
安装kibana:
通过docker 下载 kibana:
docker pull kibana:7.12.1 // 下载kibana
创建kibana网络:
docker network create kibana-network
运行kibana镜像,创建容器:
docker run -d \
--name kibana \
--net=kibana-network \
-e ELASTICSEARCH_HOSTS=http://es的服务器ip地址:9200 \
-p 5601:5601 \
docker.elastic.co/kibana/kibana:7.12.1
找到/usr/share/kibana/config 下的 kibana.yml文件并编辑,添加一下代码:
i18n.locale: "zh-CN"
elasticsearch.username: "elastic"
elasticsearch.password: "你安装ES时设置的密码"
退出容器,再重启容器:
访问页面:输入ES账号和密码
ES基础语法:
创建索引语法结构 :
PUT /${index_name} // 索引名称
{
"settings":{
... 索引相关的配置项目,如何:分配个数 副分片个数等
},
"mappings":{
... 数据的结构
}
}
PUT /my_es //索引名(相当于数据库名)
{
"settings": {
"number_of_shards": 2, //主分片
"number_of_replicas": 2 //副分片
},
"mappings": {
"properties": {
"title":{"type":"text" //设置类型},//属性
"content":{"type": "text"},
"author":{"type": "text"},
"time":{"type": "date"}
}
}
}
添加文档:
POST /my_es/_doc
{
"title":"",
"contect": "",
"author":"",
"time":"2023-12-18T11:22:09"
}
语法规则:
_doc:用于早期的ES版本中,同一个索引中单独集合映射类型,从8.X版本开始已全面废弃。
_index:创建新索引,index索引是创建一个命名空间,将相关文档聚合在一起
_create:创建新索引,create是创建一个新的文档,并将其添加到指定索引中
_update:用于更新文档中的一部分内容
_dekete:删除文档
更新索引:
_doc方式:
POST /taobao_goods/_doc/pxDtgIwBSpOnL5tfKOgA
{
"name":"今麦郎面",
"price":"5"
}
//这种方式会重写原有数据结构(慎用)
_update方式:
POST /taobao_goods/_update/pxDtgIwBSpOnL5tfKOgA
{
"doc": {
"name":"今麦郎面",
"price":"5"
}
}
//只会修改对应字段
//如果没有会直接添加
_doc:覆盖方式完成更新,8.0以后废除
_update:非覆盖方式完成更新,只修改功能
删除文档:
通过ES的_id删除:
DELETE /taobao_goods/_doc/pxDtgIwBSpOnL5tfKOgA
//通过_id删除
通过mysql的id删除:
DELETE /taobao_goods/_delete_by_query
{
"query":{
"match":{"id":"2"}
}
}
//通过mysql的id删除
删除所有:
DELETE /taobao_goods/_delete_by_query
{
"query":{
"match_all":{}
}
}
//删除所有
查询所有数据:
GET /my_es/_search
多条件查询:
GET /taobao_goods/_search
{
"query": {
"bool": { //多条件查询的一种方式
"must": [ //必须满足以下条件相当于sql中的and
{"match": {"name": "康师傅"}},
{"match": {"description": "好吃"}}
]
}
}
}
1、must:必须都匹配,相当于逻辑的and
2、must_not:表示条件必须都不匹配,相当于逻辑中的not
3、should:表示条件可以匹配,但不是必须,相当于逻辑上的or
4、filter:表示条件必须匹配,常用过滤操作
返回结果:
{
"took" : 44, //操作花费的毫秒数,请求耗时
"timed_out" : false, //是否超时
"_shards" : { //分片信息(包含了成功的分片数量和失败的分片数量)
"total" : 2, //总分片数(总命中数)
"successful" : 2, //搜索成功的分片数
"skipped" : 0, //没有搜索或跳过的分片数
"failed" : 0 //搜索失败的分片数
},
"hits" : { //搜索结果集
"total" : { //返回多少数据
"value" : 1, //一共一条数据
"relation" : "eq" //过滤语法(eq表示=)
},
"max_score" : 0.8630463, //最高匹配的房
"hits" : [
{
"_index" : "taobao_goods", //索引名
"_type" : "_doc", // 文档类型(8.X以后已禁用)
"_id" : "phDrgIwBSpOnL5tfO-gx", //唯一标识符
"_score" : 0.8630463, //匹配度得分
"_source" : { //实际内容
"id" : "1",
"name" : "康师傅酸菜牛肉面",
"description" : "好吃的很",
"price" : "5",
"stock" : "100"
}
}
]
}
}
实现Demo:
步骤 1: 创建商品搜索索引:
首先,使用 HTTP PUT 请求来创建一个名为 "product_index" 的索引。你可以指定该索引的设置,比如分片数量和副本数量。这里我们假设使用默认设置。
PUT /helloword //创建索引
步骤 2: 向索引中添加商品数据:
接下来,使用 HTTP POST 请求向新创建的 "product_index" 索引中添加商品数据。以下是一个简单的商品数据示例:
POST http://localhost:9200/helloword/_doc/1
{
"product_name": "华为 P40 手机",
"description": "一款性能强劲的智能手机,拥有卓越的摄像和处理能力。",
"price": 3999.00,
"in_stock": true,
"category": "电子产品",
"tags": ["智能手机", "华为", "科技"]
}
POST http://localhost:9200/helloword/_doc/2
{
"product_name": "苹果 MacBook Pro",
"description": "一款高性能的笔记本电脑,适用于专业工作和日常使用。",
"price": 9999.00,
"in_stock": true,
"category": "电脑",
"tags": ["笔记本", "苹果", "电脑"]
}
在这个示例中,我们向 "product_index" 索引中添加了两个商品文档。每个文档都包含了商品的名称、描述、价格、库存情况、类别和标签信息。
步骤 3: 执行搜索查询
一旦数据被添加到索引中,你可以使用 HTTP POST 请求执行搜索查询。以下是一个简单的搜索查询示例,用于查找所有包含 "智能手机" 标签的商品:
POST http://localhost:9200/helloword/_search
{
"query": {
"match": {
"tags": "智能手机"
}
}
}
通过执行这个搜索查询,Elasticsearch 将会返回包含 "智能手机" 标签的商品文档。
通过这些步骤,你可以创建一个商品搜索的索引,并向其中添加商品数据。随后,你可以执行搜索查询来检索和分析这些商品数据。