ElasticSearch(搜索引擎)

可视化工具icon-default.png?t=N7T8https://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.0

http.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 将会返回包含 "智能手机" 标签的商品文档。

                通过这些步骤,你可以创建一个商品搜索的索引,并向其中添加商品数据。随后,你可以执行搜索查询来检索和分析这些商品数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值