Elasticsearch实战应用

1、Elasticsearch 简介

Elasticsearch 是一个基于 Lucene 的分布式搜索和分析引擎,由 Elastic 公司开发并维护。它最初于2010年发布,迅速成为大数据领域中处理和分析海量数据的热门工具。Elasticsearch 的核心功能包括全文搜索、结构化搜索、数据分析以及实时数据处理。其设计理念是提供一个简单易用的接口,使得用户能够快速构建和部署复杂的搜索和分析应用。

Elasticsearch 的主要特点包括:

  1. 分布式架构:Elasticsearch 采用分布式架构,能够自动分片和复制数据,确保高可用性和可扩展性。
  2. 实时搜索:支持近乎实时的搜索和数据分析,数据写入后几乎立即可以被搜索到。
  3. 全文搜索:强大的全文搜索能力,支持多种查询类型和复杂的查询语法。
  4. 数据分析:内置丰富的聚合功能,支持对数据进行多维度的分析和统计。
  5. RESTful API:提供简单易用的 RESTful API,方便开发者通过 HTTP 请求与 Elasticsearch 进行交互。

Elasticsearch 的应用场景非常广泛,涵盖了多个行业和领域。例如,在电子商务中,Elasticsearch 可以用于商品搜索和推荐系统;在日志分析中,它可以用于实时监控和故障排查;在内容管理系统中,它可以用于全文搜索和内容检索。此外,Elasticsearch 还被广泛应用于网络安全、金融分析、医疗数据分析等领域。

总的来说,Elasticsearch 凭借其强大的搜索和分析能力,以及灵活的分布式架构,已经成为现代数据处理和分析领域不可或缺的工具。

2、Elasticsearch 的基本概念和术语

在深入了解 Elasticsearch 的实战应用之前,首先需要掌握一些基本概念和术语,这些概念是理解和使用 Elasticsearch 的基础。

  1. 索引(Index):索引是 Elasticsearch 中存储数据的基本单位,类似于关系型数据库中的数据库。每个索引由一个或多个分片组成,分片可以分布在不同的节点上,以实现数据的分布式存储和处理。索引的创建和管理是 Elasticsearch 数据管理的核心操作之一。

  2. 文档(Document):文档是 Elasticsearch 中存储的基本数据单元,类似于关系型数据库中的记录。每个文档都有一个唯一的 ID,并且可以包含多个字段。文档以 JSON 格式存储,支持嵌套结构和复杂数据类型。文档的索引和检索是 Elasticsearch 最常见的操作之一。

  3. 字段(Field):字段是文档中的数据项,类似于关系型数据库中的列。每个字段都有一个数据类型,如字符串、整数、日期等。字段的数据类型决定了 Elasticsearch 如何索引和搜索该字段的数据。字段的定义和管理是索引设计的重要部分。

  4. 映射(Mapping):映射定义了索引中字段的类型和属性,类似于关系型数据库中的表结构定义。映射可以手动创建,也可以由 Elasticsearch 自动推断。映射的定义直接影响数据的索引和搜索效率。

  5. 查询(Query):查询是 Elasticsearch 中用于检索数据的操作。Elasticsearch 支持多种查询类型,包括全文搜索、结构化搜索、聚合查询等。查询可以通过 RESTful API 或客户端库发送给 Elasticsearch,并返回符合条件的结果。

  6. 聚合(Aggregation):聚合是 Elasticsearch 中用于数据分析的功能,类似于 SQL 中的 GROUP BY 操作。聚合可以对数据进行分组、统计、计算等操作,生成汇总结果。聚合功能在数据分析和报表生成中非常有用。

  7. 分片(Shard):分片是索引数据在物理存储上的划分,每个分片是一个独立的 Lucene 索引。分片可以分布在不同的节点上,以实现数据的分布式存储和处理。分片的数量和分布策略直接影响系统的性能和可扩展性。

  8. 副本(Replica):副本是分片的备份,用于提高数据的可用性和容错能力。每个分片可以有多个副本,副本可以分布在不同的节点上。副本的存在使得 Elasticsearch 能够在节点故障时继续提供服务。

  9. 节点(Node):节点是 Elasticsearch 集群中的一个服务器实例,负责存储数据和处理请求。节点可以分为多种角色,如主节点、数据节点、协调节点等。节点的配置和管理是 Elasticsearch 集群部署的重要部分。

  10. 集群(Cluster):集群是多个节点的集合,共同提供搜索和分析服务。集群中的节点通过网络通信,协同工作以实现数据的分布式存储和处理。集群的健康状态和性能监控是 Elasticsearch 运维的重要任务。

通过理解这些基本概念和术语,可以更好地掌握 Elasticsearch 的工作原理和使用方法,为后续的实战应用打下坚实的基础。

3、Elasticsearch 的安装与配置

在开始使用 Elasticsearch 之前,首先需要进行安装和配置。Elasticsearch 的安装过程相对简单,但配置选项较多,需要根据实际需求进行调整。以下是详细的安装和配置步骤。

3.1、安装 Elasticsearch

Elasticsearch 支持多种操作系统,包括 Linux、Windows 和 macOS。以下是基于 Linux 系统的安装步骤:

  1. 下载 Elasticsearch : 访问 Elasticsearch 的官方网站(https://www.elastic.co/downloads/elasticsearch),下载适合你操作系统的安装包。

  2. 解压安装包: 使用以下命令解压下载的安装包:

    bash 复制代码
    tar -xzf elasticsearch-<version>.tar.gz
  3. 启动 Elasticsearch: 进入解压后的目录,运行以下命令启动 Elasticsearch:

    bash 复制代码
    cd elasticsearch-<version> ./bin/elasticsearch

    默认情况下,Elasticsearch 会监听 localhost:9200,你可以通过浏览器访问 http://localhost:9200 来验证安装是否成功。

3.2、配置 Elasticsearch

Elasticsearch 的配置文件位于 config 目录下,主要包括 elasticsearch.ymljvm.optionslog4j2.properties。以下是一些常见的配置选项:

  1. elasticsearch.yml: 这是 Elasticsearch 的主配置文件,包含了许多重要的配置选项。以下是一些常见的配置项:

    • 集群名称

      java 复制代码
      cluster.name: my-cluster

      集群名称用于标识一个 Elasticsearch 集群,确保不同集群之间的节点不会混淆。

    • 节点名称

      java 复制代码
      node.name: node-1

      节点名称用于标识集群中的一个节点,方便管理和监控。

    • 数据路径

      java 复制代码
      path.data: /var/lib/elasticsearch

      数据路径指定 Elasticsearch 存储数据的目录,可以根据需要修改。

    • 日志路径

      java 复制代码
      path.logs: /var/log/elasticsearch

      日志路径指定 Elasticsearch 存储日志的目录,方便日志管理和分析。

    • 网络配置

      java 复制代码
      network.host: 0.0.0.0 http.port: 9200

      网络配置用于指定 Elasticsearch 监听的 IP 地址和端口,0.0.0.0 表示监听所有网络接口。

  2. jvm.options: 这个文件用于配置 Elasticsearch 的 JVM 参数,包括堆内存大小、垃圾回收器等。以下是一些常见的配置项:

    • 堆内存大小

      java 复制代码
      -Xms512m -Xmx512m 堆内存大小决定了 Elasticsearch 可以使用的最大内存,建议根据服务器的内存大小进行调整。
  3. log4j2.properties: 这个文件用于配置 Elasticsearch 的日志记录方式,包括日志级别、日志格式等。以下是一些常见的配置项:

    • 日志级别

      java 复制代码
      logger.action.name = org.elasticsearch.action logger.action.level = info 

      日志级别决定了日志的详细程度,可以根据需要调整。

3.3、启动与验证

完成配置后,重新启动 Elasticsearch 以应用新的配置。你可以通过以下命令启动 Elasticsearch:

bash 复制代码
./bin/elasticsearch

启动后,可以通过浏览器访问 http://localhost:9200 来验证 Elasticsearch 是否正常运行。如果一切正常,你应该会看到类似以下的 JSON 响应:

java 复制代码
{
  "name": "node-1",
  "cluster_name": "my-cluster",
  "cluster_uuid": "abc123",
  "version": {
    "number": "7.10.0",
    "build_flavor": "default",
    "build_type": "tar",
    "build_hash": "abc123",
    "build_date": "2020-11-09T00:00:00.000Z",
    "build_snapshot": false,
    "lucene_version": "8.7.0",
    "minimum_wire_compatibility_version": "6.8.0",
    "minimum_index_compatibility_version": "6.0.0-beta1"
  },
  "tagline": "You Know, for Search"
}

通过以上步骤,你已经成功安装并配置了 Elasticsearch,可以开始进行实战应用了。

4、数据索引与文档管理

在 Elasticsearch 中,数据索引和文档管理是核心操作之一。通过索引和文档管理,可以实现数据的存储、检索和更新。以下是详细的步骤和示例代码。

4.1、创建索引

索引是 Elasticsearch 中存储数据的基本单位,类似于关系型数据库中的数据库。创建索引时,可以指定索引的名称、分片数量、副本数量等参数。

示例代码:创建索引

bash 复制代码
curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d' { "settings": { "number_of_shards": 3, "number_of_replicas": 2 } } '

在这个示例中,我们创建了一个名为 my_index 的索引,并指定了 3 个主分片和 2 个副本。

4.2、插入文档

文档是 Elasticsearch 中存储的基本数据单元,类似于关系型数据库中的记录。每个文档都有一个唯一的 ID,并且可以包含多个字段。

示例代码:插入文档

bash 复制代码
curl -X POST "localhost:9200/my_index/_doc/1" -H 'Content-Type: application/json' -d' { "title": "Elasticsearch 实战", "author": "John Doe", "date": "2023-10-01" } '

在这个示例中,我们向 my_index 索引中插入了一个文档,文档的 ID 为 1,包含 titleauthordate 三个字段。

4.3、更新文档

在 Elasticsearch 中,文档是不可变的,更新文档实际上是创建一个新的文档版本。可以通过 _update API 来更新文档的部分字段。

示例代码:更新文档

bash 复制代码
curl -X POST "localhost:9200/my_index/_update/1" -H 'Content-Type: application/json' -d' { "doc": { "author": "Jane Doe" } } '

在这个示例中,我们将文档 ID 为 1author 字段更新为 Jane Doe

4.4、删除文档

删除文档是 Elasticsearch 中常见的操作之一。可以通过 _delete API 来删除指定 ID 的文档。

示例代码:删除文档

bash 复制代码
curl -X DELETE "localhost:9200/my_index/_doc/1"

在这个示例中,我们删除了 my_index 索引中 ID 为 1 的文档。

4.5、批量操作

Elasticsearch 提供了批量操作 API,可以一次性执行多个索引、更新或删除操作,提高操作效率。

示例代码:批量操作

bash 复制代码
curl -X POST "localhost:9200/_bulk" -H 'Content-Type: application/json' -d' { "index" : { "_index" : "my_index", "_id" : "2" } } { "title" : "Elasticsearch 入门", "author" : "Alice", "date" : "2023-10-02" } { "update" : { "_index" : "my_index", "_id" : "1" } } { "doc" : { "author" : "John Smith" } } { "delete" : { "_index" : "my_index", "_id" : "2" } } '

在这个示例中,我们执行了以下操作:

  1. 插入一个新文档,ID 为 2
  2. 更新 ID 为 1 的文档的 author 字段。
  3. 删除 ID 为 2 的文档。

通过以上步骤和示例代码,你可以轻松实现 Elasticsearch 中的数据索引和文档管理,为后续的搜索和分析操作打下基础。

5、搜索与查询

在 Elasticsearch 中,搜索和查询是核心功能之一。Elasticsearch 提供了丰富的查询类型和语法,可以满足各种复杂的搜索需求。以下是一些常见的搜索和查询操作。

5.1、基本查询

Elasticsearch 支持多种查询类型,包括全文搜索、结构化搜索、范围查询等。以下是一些常见的基本查询示例。

示例代码:全文搜索

bash 复制代码
curl -X GET "localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d' { "query": { "match": { "title": "Elasticsearch" } } } '

在这个示例中,我们使用 match 查询在 title 字段中搜索包含 Elasticsearch 的文档。

示例代码:结构化搜索

bash 复制代码
curl -X GET "localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d' { "query": { "term": { "author": "John Doe" } } } '

在这个示例中,我们使用 term 查询在 author 字段中精确匹配 John Doe 的文档。

示例代码:范围查询

bash 复制代码
curl -X GET "localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d' { "query": { "range": { "date": { "gte": "2023-10-01", "lte": "2023-10-31" } } } } '

在这个示例中,我们使用 range 查询在 date 字段中搜索日期范围在 2023-10-012023-10-31 之间的文档。

5.2、复合查询

Elasticsearch 支持复合查询,可以将多个查询组合在一起,实现更复杂的搜索逻辑。常见的复合查询包括 bool 查询、dis_max 查询等。

示例代码:bool 查询

bash 复制代码
curl -X GET "localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d' { "query": { "bool": { "must": [ { "match": { "title": "Elasticsearch" } }, { "term": { "author": "John Doe" } } ] } } } '

在这个示例中,我们使用 bool 查询组合了两个子查询:match 查询和 term 查询。只有同时满足这两个条件的文档才会被返回。

示例代码:dis_max 查询

bash 复制代码
curl -X GET "localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d' { "query": { "dis_max": { "queries": [ { "match": { "title": "Elasticsearch" } }, { "match": { "content": "search engine" } } ], "tie_breaker": 0.7 } } } '

在这个示例中,我们使用 dis_max 查询组合了两个 match 查询。dis_max 查询会返回得分最高的子查询结果,并根据 tie_breaker 参数调整其他子查询的得分。

5.4、聚合查询

聚合查询是 Elasticsearch 中用于数据分析的重要功能,

Metric Aggregations

Metric Aggregations 用于计算数据的统计信息,常见的 Metric Aggregations 包括:

  • Avg Aggregation:计算字段的平均值。
  • Sum Aggregation:计算字段的总和。
  • Max Aggregation:计算字段的最大值。
  • Min Aggregation:计算字段的最小值。
  • Value Count Aggregation:计算字段值的数量。

示例:计算平均值

java 复制代码
{
  "aggs": {
    "avg_price": {
      "avg": {
        "field": "price"
      }
    }
  }
}

示例:计算总和

java 复制代码
{
  "aggs": {
    "total_sales": {
      "sum": {
        "field": "sales"
      }
    }
  }
}

Bucket Aggregations

Bucket Aggregations 用于对数据进行分组,常见的 Bucket Aggregations 包括:

  • Terms Aggregation:按字段值分组。
  • Range Aggregation:按数值范围分组。
  • Date Histogram Aggregation:按时间范围分组。
  • Histogram Aggregation:按数值范围分组。

示例:按字段值分组

java 复制代码
{
  "aggs": {
    "by_category": {
      "terms": {
        "field": "category"
      }
    }
  }
}

示例:按数值范围分组

java 复制代码
{
  "aggs": {
    "by_price_range": {
      "range": {
        "field": "price",
        "ranges": [
          {
            "to": 50
          },
          {
            "from": 50,
            "to": 100
          },
          {
            "from": 100
          }
        ]
      }
    }
  }
}

Pipeline Aggregations

Pipeline Aggregations 用于对其他聚合的结果进行进一步处理,常见的 Pipeline Aggregations 包括:

  • Derivative Aggregation:计算聚合结果的导数。
  • Moving Average Aggregation:计算移动平均值。
  • Cumulative Sum Aggregation:计算累积和。

示例:计算移动平均值

java 复制代码
{
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "date",
        "interval": "month"
      },
      "aggs": {
        "sales": {
          "sum": {
            "field": "sales"
          }
        },
        "moving_avg": {
          "moving_avg": {
            "buckets_path": "sales"
          }
        }
      }
    }
  }
}

嵌套聚合

Elasticsearch 支持嵌套聚合,即在一个聚合中嵌套另一个聚合。嵌套聚合可以用于更复杂的数据分析。

示例:按类别分组并计算每个类别的平均价格

java 复制代码
{
  "aggs": {
    "by_category": {
      "terms": {
        "field": "category"
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

聚合查询的实现步骤

  1. 定义查询:首先定义一个查询,用于过滤和选择需要分析的数据。
  2. 定义聚合:在查询中定义一个或多个聚合,指定聚合的类型和参数。
  3. 执行查询:将查询发送到 Elasticsearch,获取聚合结果。

示例:完整的聚合查询

java 复制代码
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "by_category": {
      "terms": {
        "field": "category"
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

6、参考资料

相关推荐
Mephisto.java4 小时前
【大数据学习 | Spark】Spark的改变分区的算子
大数据·elasticsearch·oracle·spark·kafka·memcache
mqiqe5 小时前
Elasticsearch 分词器
python·elasticsearch
小马爱打代码5 小时前
Elasticsearch简介与实操
大数据·elasticsearch·搜索引擎
java1234_小锋13 小时前
Elasticsearch是如何实现Master选举的?
大数据·elasticsearch·搜索引擎
梦幻通灵19 小时前
ES分词环境实战
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客20 小时前
Elasticsearch 中的热点以及如何使用 AutoOps 解决它们
大数据·运维·elasticsearch·搜索引擎·全文检索
小黑屋说YYDS1 天前
ElasticSearch7.x入门教程之索引概念和基础操作(三)
elasticsearch
Java 第一深情1 天前
Linux上安装单机版ElasticSearch6.8.1
linux·elasticsearch·全文检索
KevinAha2 天前
Elasticsearch 6.8 分析器
elasticsearch
wuxingge2 天前
elasticsearch7.10.2集群部署带认证
运维·elasticsearch