ElasticSearch入门篇

简介

**ElasticSearch简介:**简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单个开源的分布式搜索引擎,可以用来实现搜索,日志统计,分析,系统监控等多种功能。

Elastic Stack(ELK): 是以Elasticsearch为核心的技术栈,其中包括beats。logstash,kibanba,Elasticsearch。

正向索引和倒排索引

正向索引,假设我们有一个商品表,id是主键

如果我们按照id查询数据,他会走索引,查询效率很快,但是一般来说我们是会按照title来搜索,sql语句如下:

select * from good where title like "%手机%"

他查询需要全表扫描,一个个去匹配,效率可想而知,这就是正向索引,他在做局部内容检索的时候效率十分底。

倒排索引

文档:每条数据就是一个文档,类似于数据库中一张表的一条数据

词条:就是把文档分成一个个词语

假如同样我们搜索华为手机,基于倒排索引,他首先会将华为手机进行分词,获得文档id之后基于id进行查询文档,这时候虽然经过两次检索,但是每次都是基于索引的,总的来说,效率很高。

MySQL和Es的概念对比

Mysql: 擅长事务类型操作,可以确保数据的安全和一致性
**Elasticsearch:**擅长海量数据的搜索、分析、计算

安装Elasticsearch和kibana

安装Elasticsearch

我们这里继续使用docker来安装

1,创建一个网络,因为我们需要让kibana容器和es互联

复制代码
docker network create es-net

2,拉取镜像

复制代码
docker pull elasticsearch

但是es有差不多一个G拉取速度太慢,建议下载制作好的文件,上传,直接加载成镜像,例如上传es.tar将他加载为镜像,速度会很快。

如果你直接拉取的镜像这个命令不需要执行:

复制代码
docker load -i es.tar

3,运行es容器

复制代码
docker run -d \
	--name es \
    -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
    -e "discovery.type=single-node" \
    -v es-data:/usr/share/elasticsearch/data \
    -v es-plugins:/usr/share/elasticsearch/plugins \
    --privileged \
    --network es-net \
    -p 9200:9200 \
    -p 9300:9300 \
elasticsearch:7.12.1

命令解释:

  • -e "cluster.name=es-docker-cluster":设置集群名称

  • -e "http.host=0.0.0.0":监听的地址,可以外网访问

  • -e "ES_JAVA_OPTS=-Xms512m -Xmx512m":内存大小,因为他是基于java开发的

  • -e "discovery.type=single-node":非集群模式

  • -v es-data:/usr/share/elasticsearch/data:挂载逻辑卷,绑定es的数据目录

  • -v es-logs:/usr/share/elasticsearch/logs:挂载逻辑卷,绑定es的日志目录

  • -v es-plugins:/usr/share/elasticsearch/plugins:挂载逻辑卷,绑定es的插件目录

  • --privileged:授予逻辑卷访问权

  • --network es-net :加入一个名为es-net的网络中

  • -p 9200:9200:端口映射配置

4,浏览器输入ip:9200如果出现

安装成功!!!!

安装Kibana

kibana可以给我们提供一个elasticsearch的可视化界面,便于我们更方便使用es

1,拉取镜像

复制代码
docker pull kibana

这里还是建议上传打包好的镜像,将他重新加载成镜像,如果直接拉取不需要执行这个命令

复制代码
docker load -i kibana.tar

2,启动kibana容器

复制代码
docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=es-net \
-p 5601:5601  \
kibana:7.12.1

命令解释:

  • --network es-net :加入一个名为es-net的网络中,与elasticsearch在同一个网络中

  • -e ELASTICSEARCH_HOSTS=http://es:9200":设置elasticsearch的地址,因为kibana已经与elasticsearch在一个网络,因此可以用容器名直接访问elasticsearch

  • -p 5601:5601:端口映射配置

3,浏览器输入ip:5601即可查看-(启动较慢,稍等一会)

安装成功!!!

ES-操作索引库(类似MySQL的表)

mapping属性

mapping是对索引库中文的约束,常见的mapping属性包括:

type:字段数据类型,常见的简单类型有:

字符串:text(可分词文本),keyword(不可分词,例如国家,品牌,ip等等)

数值:long,integer,short,double,float

布尔:boolean

日期:date

对象:object

index:是否创建索引,默认为true。

analyzer:使用那种分词器。

properties:子字段,对象嵌套时需要。

创建索引库-类似于数据库的表

假如我们数据库有一个用户表,其中一条数据如下:

复制代码
{  
  "id": 1,  
  "age": 21,  
  "weight": 52.1,  
  "isMarried": false,  
  "info": "csdn最靓的崽!!",  
  "email": "gde@nb.cn",  
  "scores": [  99.1,99.5,98.9],  
  "name": {  
    "firstName": "蛋儿",  
    "lastName": "狗"  
  }  
}

不难看出数据库表如何创建的,我们来看看在es中如何创建 索引库

这是一个示例:

复制代码
# 创建索引库
PUT /索引库名称
{
  "mappings": {
    "properties": {
      "字段1":{
        "type":"类型,例如text",
        , "analyzer": "使用哪种分词器"
      },
      "字段2":{
        "type": "类型,例如keyword",
        "index": false # 不适用索引
      },
      "字段3":{
        "properties": {
          "子字段1";{
            "type":"字段类型"
          },
          "子字段2";{
            "type":"字段类型"
          }
        }
      }
    }
  }
}

实现之后(我们取少量字段):

复制代码
# 创建索引库
PUT /userinfo
{
  "mappings": {
    "properties": {
      "info":{
        "type":"text",
        "analyzer": "ik_smart"
      },
      "email":{
        "type": "keyword",
        "index": false 
      },
      "age":{
        "type": "integer",
        "index": false
      },
      "name":{
        "properties": {
          "dirstName":{
            "type":"keyword"
          },
          "lastName":{
            "type":"keyword"
          }
        }
      }
    }
  }
}

注意:索引名必须小写!!

索引库查询

复制代码
GET /索引库名

索引库删除

复制代码
DELETE /索引库名

索引库修改

需要注意的是es在索引库创建的时候就会基于索引库创建倒排索引,如果修改索引库结构倒排索引就会失效,所以,es是不允许修改索引库 的,但是可以在索引库中增加新的字段。

复制代码
# 向索引库中增加一个字段
PUT /索引库名/_mapping
{
  "properties":{
    "新字段名":{
      "type":"字段类型"
    }
  }
}

Es-操作文档

(类似MySQL的数据)

索引库插入一条文档

示例语句:

复制代码
# 向索引库中插入一条数据
POST /userinfo/_doc/文档id,例如1,2。。。
{
  "字段1":"值1",
  "字段2":"值2",
  "字段3":{
    "子属性1":"值3",
    "子属性2":"值4"
  }
}

具体实现:

复制代码
# 向索引库中插入一条数据
POST /userinfo/_doc/1
{
  "info":"csdn最靓的崽!!",
  "email":"gde@nb.cn",
  "age":"20",
  "name":{
    "dirstName":"狗",
    "lastName":"蛋儿"
  }
}

索引库查询的文档

复制代码
# 查询id为1的数据
GET /索引库名/_doc/1

#查询所有数据
GET /userinfo/_search  
{  
  "query": {  
    "match_all": {}  
  }  
}

索引库删除一条文档

复制代码
#删除id为1的数据
DELETE /userinfo/_doc/1

索引库修改文档

1,全量修改

原本插入文档使用的是POST请求这时候只需要换成PUT请求即可,它会将原有的文档删除在重新插入,例如:

复制代码
# 全量修改 修改索引库中id为1的数据,如果不存在就插入
PUT /userinfo/_doc/1
{
  "info":"csdn最靓的崽!!",
  "email":"gde@nb.cn",
  "age":"20",
  "name":{
    "dirstName":"狗",
    "lastName":"蛋儿"
  }
}

2,局部修改

复制代码
# 局部修改
POST /userinfo/_update/1
{
  "doc": {
    "age":"99"
  }
}

至此es基础篇完结!!!!!!

相关推荐
千里码aicood35 分钟前
计算机大数据、人工智能与智能系统开发定制开发
大数据·人工智能·深度学习·决策树·机器学习·森林树
非著名架构师2 小时前
城市通风廊道的科学依据:气候大数据如何指导未来城市规划设计
大数据·风光功率预测·高精度气象数据
IIIIIILLLLLLLLLLLLL2 小时前
Hadoop集群时间同步方法
大数据·hadoop·分布式
搞科研的小刘选手3 小时前
【经管专题会议】第五届大数据经济与数字化管理国际学术会议(BDEDM 2026)
大数据·区块链·学术会议·数据化管理·经济理论
蓝耘智算3 小时前
GPU算力租赁与算力云平台选型指南:从需求匹配到成本优化的实战思路
大数据·人工智能·ai·gpu算力·蓝耘
liliangcsdn3 小时前
如何用bootstrap模拟估计pass@k
大数据·人工智能·bootstrap
DMD1683 小时前
AI赋能旅游与酒店业:技术逻辑与开发实践解析
大数据·人工智能·信息可视化·重构·旅游·产业升级
Elastic 中国社区官方博客4 小时前
Elasticsearch 中使用 NVIDIA cuVS 实现最高快 12 倍的向量索引速度:GPU 加速第 2 章
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索·数据库架构
jqpwxt4 小时前
启点智慧景区多商户分账系统,多业态景区收银管理系统
大数据·旅游
jkyy20145 小时前
线上线下融合、跨场景协同—社区健康医疗小屋的智能升级
大数据·人工智能·物联网·健康医疗