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、参考资料

相关推荐
码农易小航3 小时前
封装ES高亮Yxh-Es
大数据·elasticsearch·搜索引擎
TechCraftsman数据库专栏3 小时前
为什么需要 ElasticSearch
数据库·elasticsearch
小小工匠3 小时前
ElasticSearch - Bucket Script 使用指南
elasticsearch·bucket script
程序员爱中国4 小时前
Elasticsearch - 基础入门篇
大数据·elasticsearch·搜索引擎
蜡笔小柯南9 小时前
Elasticsearch 安装教程:驾驭数据海洋的星际导航仪
大数据·elasticsearch·jenkins
寰梦9 小时前
es安装拼音分词后Kibana出现内存错误
大数据·elasticsearch·jenkins
Elastic 中国社区官方博客11 小时前
将你的 Kibana Dev Console 请求导出到 Python 和 JavaScript 代码
大数据·开发语言·前端·javascript·python·elasticsearch·ecmascript
御前一品带刀侍卫20 小时前
elasticsearch基础
大数据·elasticsearch·搜索引擎
武子康21 小时前
大数据-191 Elasticsearch - ES 集群模式 配置启动 规划调优
java·大数据·elk·elasticsearch·搜索引擎·全文检索
落落落sss21 小时前
es实现自动补全
大数据·服务器·elasticsearch·搜索引擎·全文检索