前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【ES三周年】十分钟快速入门Elasticsearch

【ES三周年】十分钟快速入门Elasticsearch

原创
作者头像
windealli
发布2023-03-03 20:17:54
1.5K0
发布2023-03-03 20:17:54
举报
文章被收录于专栏:windealliwindealli

Elasticsearch

1. 简介

1.1 什么是Elaticsearch

Elasticsearch 是分布式、可扩展、实时的搜索与数据分析引擎,一般简称ES。

Elasticsearch 主要提供一下功能和特性:

  • 数据存储: Elasticsearch 是一个分布式文档存储引擎。支持多达 PB 级别的结构化或者非结构化数据存储和查询。
  • 搜索与分析: 建立在全文搜索引擎库 Apache Lucene™基础之上,提供了一个简单、连贯的 REST API,用于管理您的集群以及索引和搜索您的数据
  • 可拓展性与弹性: 支持从单个节点到上百个节点的任意扩展

1.2 Elasticsarch 应用场景

Elasticsearch是一个强大的分布式搜索和分析引擎,可以应用于许多场景。以下是一些常见的Elasticsearch应用场景:

  • 搜索引擎: Elasticsearch最初是一个搜索引擎,因此在构建需要强大搜索功能的应用程序时非常有用。例如,电子商务网站可以使用Elasticsearch来提供高效的产品搜索,以及建议和纠错功能。
  • 日志分析: Elasticsearch是一个流行的日志分析工具,它可以通过将日志数据存储在Elasticsearch中,然后使用Kibana来可视化和分析日志数据,帮助企业发现潜在的问题和异常。
  • 业务智能: 企业可以使用Elasticsearch来收集和分析各种数据源(例如数据库、网络、日志等)来进行业务智能分析。它可以帮助企业识别趋势和模式,以及评估业务表现和关键指标。
  • 安全监控: Elasticsearch可以用于安全监控,例如实时监视网络数据、日志数据和安全事件等。这可以帮助企业快速检测并解决潜在的安全问题。
  • 实时数据处理: Elasticsearch支持实时索引和搜索功能,因此可以作为实时数据处理平台使用。例如,当需要实时监控应用程序性能时,可以使用Elasticsearch来收集和分析性能指标。

总之,Elasticsearch非常适合需要强大搜索和分析功能的应用程序,并且可以应用于许多不同的场景,例如日志分析、业务智能、安全监控和实时数据处理等。

1.3 Elasticserach 与 ELK

ELK是三个开源工具的缩写,分别是Elasticsearch、Logstash和Kibana。

这三个工具通常一起使用(经常还会配合Beats组件一起使用),作为完整的日志管理和分析解决方案。

  • Elasticsearch: Elasticsearch是一个基于Lucene的分布式搜索和分析引擎,可以用于快速存储、搜索和分析大量结构化和非结构化数据。
  • Logstash: Logstash是一个用于处理和转换日志数据的开源数据收集引擎,可以从多种数据源中收集、转换和发送数据到各种目标。
  • Kibana: Kibana是一个用于可视化和分析日志数据的开源分析和可视化平台,可以使用丰富的图表、图形和地图展示数据,并通过查询和过滤等功能实现数据探索和可视化。
  • Beats: 轻量级的数据采集器

2. 环境安装

Elasticsearch 官方文档 Set up Elasticsearch 介绍了不同场景下Elasticsearch的安装方式。

Kibana 官方文档 Set up 介绍了不同场景下Kibana的安装方式。

Elasticsearch 提供了Restful风格的API, 可以直接使用http客户端工具如curl等直接操作数据。

但是就学习而言,使用可视化工具Kibana更便捷一些。

此处简单介绍通过Docker快速搭建Elasticsearch 和 Kibana的学习华景。

2.1 使用Docker安装Elasticsearch和Kibana

代码语言:shell
复制
[windealli@VM-52-29-centos ~]$ docker network create elastic
[windealli@VM-52-29-centos ~]$ docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.9
[windealli@VM-52-29-centos ~]$ docker run -d --name es01-test --net elastic -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.17.9
[windealli@VM-52-29-centos ~]$ docker pull docker.elastic.co/kibana/kibana:7.17.9
[windealli@VM-52-29-centos ~]$ docker run -d  --name kib01-test --net elastic -p 5601:5601 -e "ELASTICSEARCH_HOSTS=http://es01-test:9200" docker.elastic.co/kibana/kibana:7.17.9

3. Elasticsearch 的基本概念

  • 索引: 类似于关系数据库中的数据库, 用户的数据新增、搜索和更新等操作的对象全部对应索引
  • 文档:, 类似于关系型数据库中的一条记录, 用户数据操作的最小颗粒度的对象
  • 字段: 与关系型数据库中的字段/列类似, ES提供了更加丰富的字段类型, 如数组、经纬度、IP地址等类型
  • 映射: 文档的数据结构
  • 集群和节点: 分布式中的集群与节点
  • 分片和副分片: 对数据(索引)进行切分存储到多个节点中, 索引的分配设置后不能修改,副分片是分片的副本
  • DSL: Domain Specific Language,领域特定语言, 常见的HTML、CSS、SQL等都属于DSL, ES中的DSL采用JSON进行表达

Elasticsearch中的概念可以类比关系型数据库MySQL:

Elasticsearch

关系型数据库MySQL

索引

数据库

映射

表结构

文档

记录

字段

字段/列

集群和节点

集群和节点

分片

分片

DSL(基于JSON)

SQL

4. ES的基本使用

打开Kibana的DevTool: http://127.0.0.1:5601/app/dev_tools#/console可以进行ES的基本操作

evernotecid://7D20C308-3D50-459D-A54D-B87FB1FC2C81/appyinxiangcom/11494076/ENResource/p1053

4.1 快速上手

创建索引
代码语言:json
复制
PUT /my_index_001 
写入文档

写入文档使用POST请求,

单条写入:

代码语言:json
复制
POST /my_index_001/_doc
{
  "user_id": 1001,
  "user_name": "张三",
  "company": "南山必胜客有限公司"
}

批量写入:

代码语言:json
复制
POST /_bulk
{"index": {"_index": "my_index_001"}}
{"user_id": 1002, "user_name": "李四", "company": "龙岗无敌手有限公司"}
{"index": {"_index": "my_index_001"}}
{"user_id": 1003,"user_name": "王五", "company": "龙岗无敌手有限公司", "age": 30}
查看mapping

在创建索引的时候,我们并没有定义索引的mapping, ES在写文档的时候会自动帮我们创建mapping, 并且我们插入的最后一个文档比前面两个文档多了一个额age字段。

我们看下当前的索引mapping

代码语言:json
复制
// 请求:
GET /my_index_001/_mapping

// 应答:
{
  "my_index_001" : {
    "mappings" : {
      "properties" : {
        "age" : {
          "type" : "long"
        },
        "company" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "user_id" : {
          "type" : "long"
        },
        "user_name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

可以看出ES帮我们自动创建并拓展了索引的mapping。

但是,由于自动创建的mapping的字段类型等可能与我们的预期不一定一直,因此在实际应用中最好还是在创建索引的时候确认好mapping。

搜索文档

搜索用户名为张三的文档:

代码语言:json
复制
POST /my_index_001/_search
{
  "query": {
    "match": {
      "user_name": "张三"
    }
  }
}

搜索公司名包含“必胜客”的文档,(ES中,中文按字进行分词)

代码语言:json
复制
POST /my_index_001/_search
{
  "query": {
    "match": {
      "company": "必胜客"
    }
  }
}
更新文档

根据文档id更新文档

代码语言:json
复制
POST /my_index_001/_update/s3Q1poYBVgNs6Cfh3Wc9
{
  "doc": {
    "user_name": "张三update"
  }
}

根据条件更新文档

代码语言:json
复制
// 将缺少age字段的文档,填充age字段,设置值为20
POST /my_index_001/_update_by_query
{
  "query": {
    "bool": {
      "must_not": {
        "exists": {
          "field": "age"
        }
      }
    }
  },
  "script": {
    "source": "ctx._source['age']=20",
    "lang": "painless"
  }
}

5. Elasticsearch 的架构

5.1 Elasticsearch 集群架构

Elasticsearch 通过多节点的集群架构来保证系统的弹性拓展和高可用。

Elasticsearch 的节点按照功能角色可以分为三类:

  • Master节点: 只有一个,选举产生。维护整个集群的相关工作,管理集群变更。
  • 数据节点: 数据的删除、修改、查询。
  • 协调节点: 协调客户端的请求

节点的分类只是逻辑上的分类,比如在我们的单节点学习环境中,Master节点、数据节点和协调节点对应的都是同一个物理节点。

在生产环境中,可以分别给Master节点和协调节点专门指定一批物理节点,因此其架构如下图所示:

分片与路由选择

Elasticsearch 通过将数据按分片进行切分,以支持分布式搜索。

Elasticsearch 在创建索引是可以指定分片数和分片的副本数

代码语言:json
复制
PUT /my_index_002
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1
  }
}

下图是Elasticsearch分配的示意图

集群中包含:

  • 3个节点: node-01,node-02,node-03
  • 2个索引: s_A,s_B
  • 索引s_A切分为3个分片,副本数1: 主分片包括s_A1,s_A2,s_A3;副分片有s_A1’,s_A2', sA3‘;
  • 索引s_B切分为2个分片,副本数1: 主分片包括s_B1,s_B2;副分片有s_B1’,s_B2'‘;
写入文档

文档写入时(假设向索引s_A写入文档),协调节点根据下面的公式先计算文档需要落在哪个分片:

代码语言:shell
复制
shard=hash(routing)%number_of_primary_shards

routing代表每条文档提交时的参数,该值是可变的,用户可以自定义,在默认情况下使用的是文档的_id值;number_of_primary_shards是索引中主分片的个数。

得到分配ID:shard后,根据分配与节点的路由表,将文档数据转发给对应的节点。

获取文档

与写入文档类似,获取文档同样是先计算分配ID,然后根据路由表得到对应分片(可以是主分片,也可以是副分片)的节点。

6 文本搜索原理

前面我们介绍Elasticsearch的基本使用时,有使用到了其搜索能力。强大搜索能力是Elasticsearch最重要的特性之一。

如果仅仅只是吧文档分片存储,在搜索时岂不是要全量扫描?其实并非如此, Elasticsearch基于Lucene和分析器两大组件来实现强大的搜索能力。

  • Lucene: 负责进行倒排索引的物理构建,
  • 分析器: 负责在建立倒排索引前和搜索前对文本进行分词和语法处理。

6.1 倒排索引

倒排索引其实就是根据字段值来映射记录(文档)的位置。以我们前面创建的三个文档为例。

文档ID

user_id

user_name

company

age

s3Q1poYBVgNs6Cfh3Wc9

1001

张三

南山必胜客有限公司

20

tHQ-poYBVgNs6Cfh72fO

1002

李四

龙岗无敌手有限公司

20

tXQ-poYBVgNs6Cfh72fO

1003

王五

龙岗无敌手有限公司

30

Lucene针对每一个字段建立倒排索引,以user_id为例:

Key(user_id)

Value(文档ID

1001

s3Q1poYBVgNs6Cfh3Wc9

1002

tHQ-poYBVgNs6Cfh72fO

1003

tXQ-poYBVgNs6Cfh72fO

Lucene建立倒排索引时,会对Key进行排序,这样在搜索的时候就可以进行二分查找。(写入时排序相比关系型数据库,其写入速度比较慢,因此其在事务性、实时性要求高的场景下就不太适用。

模糊搜索与分词:

在搜素的场景中,除了进行全文匹配,经常还需要进行模糊搜索。

这就需要对字段的值进行分词。 在英文中,分词可以按照单次进行,在中文中,最简单的分词就是单字了。

以company为例:

Key(user_id)

Value(company )

s3Q1poYBVgNs6Cfh3Wc9

s3Q1poYBVgNs6Cfh3Wc9

s3Q1poYBVgNs6Cfh3Wc9

s3Q1poYBVgNs6Cfh3Wc9

s3Q1poYBVgNs6Cfh3Wc9

s3Q1poYBVgNs6Cfh3Wc9,tHQ-poYBVgNs6Cfh72fO,tXQ-poYBVgNs6Cfh72fO

s3Q1poYBVgNs6Cfh3Wc9,tHQ-poYBVgNs6Cfh72fO,tXQ-poYBVgNs6Cfh72fO

s3Q1poYBVgNs6Cfh3Wc9,tHQ-poYBVgNs6Cfh72fO,tXQ-poYBVgNs6Cfh72fO

s3Q1poYBVgNs6Cfh3Wc9,tHQ-poYBVgNs6Cfh72fO,tXQ-poYBVgNs6Cfh72fO

tHQ-poYBVgNs6Cfh72fO,tXQ-poYBVgNs6Cfh72fO

tHQ-poYBVgNs6Cfh72fO,tXQ-poYBVgNs6Cfh72fO

tHQ-poYBVgNs6Cfh72fO,tXQ-poYBVgNs6Cfh72fO

tHQ-poYBVgNs6Cfh72fO,tXQ-poYBVgNs6Cfh72fO

tHQ-poYBVgNs6Cfh72fO,tXQ-poYBVgNs6Cfh72fO

搜搜索时,会对每个文档ID根据匹配程度进行打分,排序。最后按照相关性返回。

6.2 文本索引的建立

6.3 文本的搜索

参考资料

Elasticsearch 官方文档

Elasticsearch搜索引擎构建入门与实战

ChatGPT

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Elasticsearch
    • 1. 简介
      • 1.1 什么是Elaticsearch
      • 1.2 Elasticsarch 应用场景
      • 1.3 Elasticserach 与 ELK
    • 2. 环境安装
      • 2.1 使用Docker安装Elasticsearch和Kibana
    • 3. Elasticsearch 的基本概念
      • 4. ES的基本使用
        • 4.1 快速上手
      • 5. Elasticsearch 的架构
        • 5.1 Elasticsearch 集群架构
        • 分片与路由选择
      • 6 文本搜索原理
        • 6.1 倒排索引
        • 6.2 文本索引的建立
        • 6.3 文本的搜索
      • 参考资料
      相关产品与服务
      Elasticsearch Service
      腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档