当前位置: 首页 > article >正文

Elasticsearch 入门教程

掌握Elasticsearch:从入门到入门

  • 一、ES 背景
    • 1.1 ElasticSearch 的背景
    • 1.2 ElasticSearch 的应用场景
  • 二、ES 简介
    • 2.1 ElasticSearch 简介
    • 2.2 ElasticSearch 的定义与特点
    • 2.3 ElasticSearch 与传统数据库的区别
    • 2.4 ElasticSearch 的优势和劣势
  • 三、ES 的核心概念
    • 3.1 倒排索引
    • 3.2 文档、索引与类型
    • 3.3 分片与副本
  • 四、安装与配置
    • 4.1 下载与安装 ElasticSearch
    • 4.2 常见配置项解析
  • 五、数据索引与搜索
    • 5.1 创建索引与插入文档
    • 5.2 执行基本搜索操作
    • 5.3 Query DSL 查询语法解析

 Logo

一、ES 背景

1.1 ElasticSearch 的背景


  Elasticsearch 是一个开源的分布式搜索引擎,最初由 Shay Banon 在 2010 年创建。它是基于 Apache Lucene 构建的,旨在提供一个简单易用、高度可扩展的搜索和分析引擎。Elasticsearch 的目标是解决传统数据库系统无法处理的大规模数据搜索和分析问题,它能够快速地索引大量的数据,并通过复杂的查询实现高效的搜索和分析功能。此外,Elasticsearch 拥有强大的聚合功能,可以从海量数据中提取有用的信息。

1.2 ElasticSearch 的应用场景


  ElasticSearch 应用于多个领域,包括但不限于:

  • 搜索引擎:构建网站、应用程序和企业内部系统的搜索功能。
  • 实时日志和指标分析:实时索引和分析大量日志数据,帮助监控系统运行状况。
  • 安全信息和事件管理 (SIEM):监视、分析和应对安全威胁。
  • 业务分析和智能推荐:支持复杂的数据聚合和分析操作。
  • 地理空间数据分析:处理和分析地理空间数据。
  • 文档存储和管理:作为文档存储和检索平台。

  ElasticSearch 适用于需要大规模、实时搜索和分析功能的场景,以及需要处理结构化和非结构化数据的应用程序和系统。

二、ES 简介

2.1 ElasticSearch 简介


  Elasticsearch 是一个分布式文档储存中间件,它不会将信息存储为列数据行,而是存储已序列化为 JSON 文档的复杂数据结构。Elasticsearch 是基于 Apache Lucene 搜索引擎库所构建的全套搜索功能。
  Elasticsearch 使用一种被称为倒排索引的数据结构,该结构支持快速全文搜索

2.2 ElasticSearch 的定义与特点


  ElasticSearch 是一个开源的分布式搜索和分析引擎,具有以下主要特点:

  1. 分布式性:能够水平扩展以处理大规模数据,并提供高可用性和容错性。
  2. 实时性:支持实时索引和查询,适用于需要快速响应的应用场景。
  3. 全文搜索:提供全文搜索功能,支持多语言、复杂查询和相关性排序等特性。
  4. 复杂查询:支持复杂的结构化查询和聚合操作,包括范围查询、多字段查询、过滤、分组和统计等。
  5. 多样化数据类型:支持处理结构化数据、半结构化数据和非结构化数据,包括文本、地理空间数据等。
  6. 弹性和灵活性:适应各种数据模型和查询需求,可灵活定制索引结构和分析器
  7. 生态系统丰富:与 LogstashKibana 等工具继承,形成 ELKElasticSearchLogstashKibana)技术栈,提供完整的日志分析和可视化解决方案。

2.3 ElasticSearch 与传统数据库的区别


特点Elasticsearch传统数据库
数据存储方式非结构化/半结构化/全文搜索结构化数据
查询处理复杂的全文搜索和聚合查询简单的 SQL 查询
可扩展性易于水平扩展通常需要垂直扩展
实时性支持实时索引和查询对实时需求支持相对较弱
相关性排序支持相关性排名和评分不太适用于全文搜索
数据类型适用于多样化数据类型主要适用于结构化数据
分布式处理分布式、高可用性和容错性通常以集中式方式部署

2.4 ElasticSearch 的优势和劣势


优势

  1. 全文搜索能力:强大的全文搜索功能,支持复杂的查询和相关性排序。
  2. 分布式架构:具有良好的水平扩展性和高可用性,适合处理大规模数据。
  3. 实时性:支持实时索引和查询,适用于需要快速响应的应用场景。
  4. 多样化数据类型:能够处理非结构化、半结构化和结构化数据,包括文本、地理空间数据等。
  5. 灵活性:能够适应各种数据模型和查询需求,提供丰富的定制化配置选项。
  6. 开源和生态系统:作为开源项目,具有庞大的社区支持和丰富的生态系统,整合了许多其他开源工具。

劣势

  1. 学习曲线:对于新用户而言,可能需要一定时间来熟悉其复杂的查询语言和配置选项。
  2. 资源消耗:在处理高负载和复杂查询时,可能需要更多的硬件资源和系统维护成本。
  3. 非实时聚合计算:对于复杂的聚合计算,可能不如专门的数据仓库或计算引擎效率高。
  4. 不适合事务处理:相较于传统关系型数据库,Elasticsearch 不适合处理需要严格事务控制的应用场景。

三、ES 的核心概念


Core Concepts

3.1 倒排索引


  倒排索引是一种索引数据结构,它将存储的信息从“ 文档到词 ”的映射转换为“ 词到文档 ”的映射。简单来说,就是对于每一个不同的词,记录包含该词的所有文档的列表。这种结构非常适合用于全文搜索,因为当你知道要查找哪个词时,可以非常快地找到包含这个词的所有文档。

构建倒排索引的过程

  1. 分词:首先,输入的文档内容会被分词器(Tokenizer)分解成单独的词汇或术语(terms)。例如,句子“Quick brown fox”可能被分解为三个词:“Quick”,“brown”和“fox”。
  2. 分析:接下来,这些词汇会经过一系列的分析步骤,比如去除停用词(如 “the”, “is” 等)、词干提取(stemming)或者词性还原(lemmatization)等,以便减少词汇变体并提高搜索的相关性。
  3. 建立索引:然后,为每个唯一的词汇创建一个条目,并列出所有包含该词汇的文档标识符及其位置信息。这个过程可能还会包括对词条进行排序、压缩等操作以优化存储和检索效率。
  4. 存储:最后,生成的倒排索引会被保存下来,使得后续可以通过查询直接访问。

查询倒排索引

  当用户执行搜索请求时,ElasticSearch 会解析查询语句,将其转换为相应的搜索条件,并利用以构建好的倒排索引来迅速定位相关文档。通过这种方式,即使是在海量数据中,也可以实现高效且准确的搜索结果并返回。

3.2 文档、索引与类型


  1. 文档Document
    1. 定义:文档是 Elasticsearch 中基本的存储单元,它是一个 JSON 格式的对象,包含了你要存储或搜索的数据。
    2. 特点
      1. 每个文档都有一个唯一的标识符(ID),可以由用户指定或者由 Elasticsearch 自动生成。
      2. 文档属于特定的索引和类型(在 ES 7.x及以后版本中,类型的概念已经被弱化)。
      3. 文档可以包含被嵌套对象和其他复杂的数据结构。
    3. 操作:可以通过创建、读取、更新和删除(CRUD)操作来管理文档。
  2. 索引Index
    1. 定义:索引是具有相似特性的文档集合,类似于传统数据库中的 “表” 或 “数据库”。每个索引都有自己的设置和映射(schema),用于定义其结构和行为。
    2. 特点
      1. 索引必须是小写字母。
      2. 可以配置分片(shards)和副本(replicas)的数量来控制性能和容错能力。
      3. 索引可以被关闭或打开,这会影响查询和写入操作。
    3. 操作:可以创建新的索引来保存数据,也可以删除不再需要的索引。
  3. 类型Type
    1. 定义:类型是在索引内部对文档进行分类的一种方式,在 ES 7.x之前的版本中广泛使用。类型允许你在同一个索引下存储不同种类但相关联的文档。
    2. 特点
      1. 在 Es 7.x 及之后的版本中,官方建议每个索引只包含一种类型的文档,即 <font style="color:#DF2A3F;">_doc</font>。这意味着类型的作用已经大大减弱。
      2. 尽管如此,你仍然可以在旧版本的索引中找到多个类型,但在新项目中应该避免这样做。
    3. 注意:从 Es 8.0 开始,类型已经被完全移除,所有文档都直接属于某个索引而没有类型区分。

文档、索引与类型之间的关系

  • 索引与文档:一个索引可以包含多个文档,每个文档都属于该索引。
  • 索引与类型(在 ES 7.x 之前):一个索引可以包含多种类型的文档,但是这个概念现在已经被简化。
  • 文档与类型(在 Es 7.x 之前):每个文档都关联到一个类型,但现在推荐每个索引仅使用默认的 _doc类型。

3.3 分片与副本


  1. 分片(Shards
    1. 定义:分片是一个 Lucene 索引,它是 Elasticsearch 内部的工作单元。一个 Elasticsearch 索引可以被分割成多个分片,每个分片都是一个独立的索引库,能够存储部分文档。
    2. 作用
      1. 水平扩展:通过将索引拆分为多个分片,可以将数据分布到不同的物理或虚拟服务器上,从而实现水平扩展,提高搜索和索引的速度。
      2. 容错性:如果某个节点失败,其他拥有相同分片副本的节点可以继续提供服务。
    3. 配置:当创建索引时,你可以指定该索引应该有多少个主分片(primary shards)。一旦确定了主分片的数量,这个数量就不能再改变,因此需要根据预期的数据量和集群规模来合理规范。
  2. 副本Replicas
    1. 定义:副本是指主分片的一个或多个拷贝。默认情况下,Elasticsearch 会为每个主分片创建一个副本。
    2. 作用
      1. 高可用性:副本提供了数据冗余,即使原主分片所在的节点发生故障,副本也可以接管请求,确保服务不中断。
      2. 读取负载均衡:副本还可以用来分担查询请求,减轻主分片的压力,特别是在读多写少的应用场景中。
      3. 灾难恢复:副本可以在原始数据丢失的情况下用于数据恢复。
    3. 配置:副本的数量是可以动态调整的。这意味着你可以在不影响现有数据的情况下增加或减少副本的数量,以适应不同的流量模式或硬件变化。
  3. 分片与副本的关系
    • 每个索引都有一定数量的主分片,这些主分片会被分配到集群中的不同节点上。
    • 对于每一个主分片,可以设置零个或多个副本。这些副本也会被分配到集群的不同节点上,但同一分片的主分片和其他所有副本不会位于同一个节点上,以避免单点故障。

四、安装与配置

4.1 下载与安装 ElasticSearch


  1. 进入官网下载压缩包
    官网地址:https://www.elastic.co/cn/downloads/elasticsearch

  2. 解压到自己的环境目录下

  3. 点击 根目录下的 binelasticsearch.bat 启动

    首次登陆会有密码,需要记一下

  4. 访问地址 http://127.0.0.1:9200/,输入用户名 elastic,密码为上面记的密码,即可进入,或者可以跳过密码验证进入,需要修改 config/elasticsearch.yml,将xpack.security.enabled: true 修改为xpack.security.enabled: false,重新启动即可。

问题:如果出现访问不了


打开 config/elasticsearch.yml,将xpack.security.http.ssl:enabled设置成false即可

4.2 常见配置项解析


  Elasticsearch(ES)的配置文件elasticsearch.yml中包含许多配置项,用于定义集群的行为、性能优化、安全性设置等。

# 1. 基本配置
# 指定 ES 集群的名称,默认值elasticsearch
cluster.name: my-cluster-name
# 为节点指定一个唯一的名称
node.name: node-1
# 指定存储索引数据的位置
path.data: /var/lib/elasticsearch
# 指定日志文件的存储位置
path.logs: /var/log/elasticsearch

# 2. 网络与发现配置
# 设置 es 监听的网络接口地址。
network.host: 0.0.0.0
# 指定 HTTP RESTful API 服务监听的端口号
http.port: 9200
# 列出用于集群发现的其他节点和主机名或IP地址列表
discovery.seed_hosts: ["host1", "host2"]
# 在集群启动时指定哪些节点应该作为初始主节点。
cluster.initial_master_nodes: ["node-1", "node-2"]

# 3. 性能调优
# 每个索引的主分片数量 默认值5
index.number_of_shards: 3
# 每个主分片的副本数量,默认值1
index.number_of_replicas: 2

# 4. 安全配置
# 是否启用内置的安全功能,如用户认证和授权
xpack.security.enabled: true
# 是否启用HTTPS协议进行加密通信
xpack.security.http.ssl.enabled: true

# 快照仓库路径
path.repo: ["/mnt/backups"]

# 其他配置,控制通过 from + size 参数可以检索的最大文档数
indices.query.bool.max_clause_count: 10000

五、数据索引与搜索

5.1 创建索引与插入文档


  在 Elasticsearch 中, 索引Index)是存储相关文档的逻辑容器。每个索引都有一个映射(Mapping),它定义了索引中的文档结构和字段类型。

  1. 创建索引
    要创建一个新的索引,你可以使用 PUT HTTP 请求,并指定索引名称。你还可以在同一请求中定义映射和其他设置。

    # 创建一个名为my-index-000001的索引,设置了一个主分片和一个副本分片,并为索引指定了三个字段:title、content和timestamp
    PUT /my-index-000001
    {
      "settings": {
        "number_of_shards": 1,
        "number_of_replicas": 1
      },
      "mappings": {
        "properties": {
          "title": { "type": "text" },
          "content": { "type": "text" },
          "timestamp": { "type": "date" }
        }
      }
    }
    
  2. 创建文档
    向索引中添加文档时,可以使用POSTPUT方法。POST用于自动分配ID,而PUT允许你指定自己的ID

    POST /my-index-000001/_doc/
    {
      "title": "Elasticsearch简介",
      "content": "Elasticsearch是一个分布式搜索引擎...",
      "timestamp": "2024-12-30T16:46:00"
    }
    
    
    PUT /my-index-000001/_doc/1
    {
      "title": "Elasticsearch进阶",
      "content": "深入理解Elasticsearch的工作原理...",
      "timestamp": "2024-12-30T17:00:00"
    }
    

5.2 执行基本搜索操作


  Elasticsearch 提供了强大的搜索功能,支持全文搜索、过滤、聚合等复杂查询。最简单的搜索方式是通过 GET 请求发送到特定索引的 _search 端点。

  1. 简单匹配查询

    # 在 my-index-000001 索引中查找所有标题包含 “Elasticsearch” 的文档。
    GET /my-index-000001/_search
    {
      "query": {
        "match": {
          "title": "Elasticsearch"
        }
      }
    }
    
  2. 多字段查询
    如何你想要同时在多个字段上进行搜索,可以使用 multi_match 查询:

    GET /my-index-000001/_search
    {
        "query": {
            "multi_match":{
                "query": "Elasticsearch",
                "fields": ["title", "content"]
            }
        }
    }
    
  3. 过滤查询
    对于精确匹配或者需要高效性能的情况,可以使用 termterms 查询来过滤结果:

    GET /my-index-000001/_search
    {
        "query": {
            "term": {
              "title": "es简介"
            }
        }
    }
    

5.3 Query DSL 查询语法解析


  Elasticsearch 使用一种成为Query DSL(Domain Specific Language) 的强大查询语言,它允许用户构建复杂的查询表达式。Query DSL 由不同的查询类型组成,每种类型适用于特定场景。

  1. match 和 match_phrase

    • match:用于全文搜索,会分析输入文本并尝试找到最佳匹配。

      {
        "query": {
          "match": {
            "content": "Elasticsearch入门"
          }
        }
      }
      
    • match_phrase:类似于 match,但要求整个短语必须完全匹配。

      {
        "query": {
          "match_phrase": {
            "content": "Elasticsearch入门"
          }
        }
      }
      
  2. bool 查询
    bool 查询组合了多个子查询,支持 mustshouldmust_notfilter条件。

    • must:所有子查询必须匹配
    • should:至少有一个子查询匹配
    • must_not:子查询不能匹配
    • filter:用于过滤文档,不计算评分(提高性能)
    {
      "query": {
        "bool": {
          "must": [
            { "match": { "title": "Elasticsearch" } }
          ],
          "filter": [
            { "term": { "status": "published" } }
          ]
        }
      }
    }
    
  3. range 查询
    range查询用于查找落在给定范围内的数值或日期字段

    {
      "query": {
        "range": {
          "timestamp": {
            "gte": "2024-12-01T00:00:00",
            "lte": "2024-12-31T23:59:59"
          }
        }
      }
    }
    
  4. nested 查询
    当你的文档中有嵌套对象时,可以使用 nested 查询来访问这些对象内部的数据。

    {
      "query": {
        "nested": {
          "path": "comments",
          "query": {
            "bool": {
              "must": [
                { "match": { "comments.content": "great post" } }
              ]
            }
          }
        }
      }
    }
    
  5. 聚合查询
    除了标准的搜索查询外,Elasticsearch 还支持聚合(Aggregations),它可有对搜索结果进行统计分析,如计数、求平均值、分组等。

    {
      "query": {
        "nested": {
          "path": "comments",
          "query": {
            "bool": {
              "must": [
                { "match": { "comments.content": "great post" } }
              ]
            }
          }
        }
      }
    }
    

http://www.kler.cn/a/461354.html

相关文章:

  • 2025考研江南大学复试科目控制综合(初试807自动控制原理)
  • 46. Three.js案例-创建颜色不断变化的立方体模型
  • 创龙3588——debian根文件系统制作
  • 跳转至系统设置下某个子模块 - 鸿蒙 Harmony
  • 【Python科研数据爬虫】基于国家标准查询平台和能源标准化信息平台的海上风电相关行业标准查询信息爬取及处理
  • 【CSS in Depth 2 精译_099】17.5:基于页面滚动的动画时间线设置(全新)+ 17.6:最后一点建议 + 17.7:本章小结
  • macos 支持外接高分辩率显示器开源控制软件
  • 应急响应练习
  • WFP Listbox绑定数据后,数据变化的刷新
  • 31.九个按钮排列 C#例子 WPF例子
  • 如何在 Ubuntu 22.04 上优化 Apache 以应对高流量网站教程
  • HTML基础到精通笔记
  • GitHub Fork 和 Clone 的深度指南:操作解析与 Pull Request 完整流程20241231
  • python浅拷贝和深拷贝
  • 【每日学点鸿蒙知识】文件读写、屏幕宽度亮度、扫一扫权限、编码器问题、wlan设置
  • “库存管理软件的用户体验”:界面与交互设计
  • rust_shyper
  • flux文生图模型实践
  • #渗透测试#红蓝攻防#红队bypass突破口总结06
  • jeecgbootvue3列表数据状态为数字时,手动赋值的三种方法
  • Python 实现 冒泡排序算法示例
  • SQL Server实现将分组的其他字段数据拼接成一条数据
  • python 快速排序(Quick Sort)
  • 本地LLM部署--llama.cpp
  • 【Qt笔记】QLineEdit控件详解
  • 当下热点系列 篇二:大消费题材解析和股票梳理