Elasticsearch核心概念与使用场景详解 | 含实战代码与应用案例

85 阅读3分钟

Elasticsearch核心概念与使用场景详解

一、引言

Elasticsearch 是一个基于 Lucene 的分布式搜索引擎,具备高可用性、可扩展性和实时搜索能力。它广泛应用于日志分析、全文检索、数据可视化等多个领域。本文将详细介绍 Elasticsearch 的核心概念、常见使用场景,并通过丰富的代码示例展示其用法,最后结合一个实际应用场景来加深理解。

二、Elasticsearch 核心概念

1. 索引(Index)

在 Elasticsearch 中,“索引”指的是存储文档的地方,类似于数据库中的“表”。每个索引都有一个唯一的名称,并且可以包含多个文档。

PUT /users
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
}

2. 文档(Document)

文档是 Elasticsearch 中的基本数据单位,以 JSON 格式存储。每个文档属于一个类型(Type),并被存储在一个索引中。

POST /users/_doc/1
{
  "name": "张三",
  "age": 28,
  "email": "zhangsan@example.com"
}

3. 类型(Type)

类型用于对索引内的文档进行分类。例如,在 users 索引下可以有 useradmin 两种类型。不过从 Elasticsearch 7.x 开始,类型已被弃用,推荐使用单一类型模型。

4. 分片(Shard)

分片是 Elasticsearch 实现水平扩展的基础。一个索引可以被分成多个分片,每个分片都是一个独立的 Lucene 索引。

5. 副本(Replica)

副本是对分片的拷贝,用于提高系统的容错能力和查询性能。默认情况下,每个主分片有一个副本。

6. 集群(Cluster)

集群是由一个或多个节点组成的集合,所有节点共同持有整个数据集。集群状态由主节点维护。

7. 节点(Node)

节点是集群中的一个服务器,负责存储数据和参与集群的管理。

三、Elasticsearch 使用场景

1. 日志分析

Elasticsearch + Logstash + Kibana(ELK Stack)是常见的日志分析解决方案。Logstash 收集日志数据,Elasticsearch 存储并提供搜索功能,Kibana 进行可视化展示。

示例:收集 Nginx 日志
# logstash.conf
input {
  file {
    path => "/var/log/nginx/access.log"
    start_position => "beginning"
  }
}

filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "nginx-logs-%{+YYYY.MM.dd}"
  }
}

2. 全文检索

Elasticsearch 提供强大的全文检索能力,支持模糊匹配、短语匹配、高亮显示等功能。

示例:实现商品搜索
GET /products/_search
{
  "query": {
    "multi_match": {
      "query": "手机",
      "fields": ["name", "description"]
    }
  },
  "highlight": {
    "fields": {
      "name": {},
      "description": {}
    }
  }
}

3. 数据聚合分析

Elasticsearch 提供丰富的聚合功能,可用于统计、分析和可视化。

示例:按城市统计用户数量
GET /users/_search
{
  "size": 0,
  "aggs": {
    "group_by_city": {
      "terms": {
        "field": "city.keyword"
      }
    }
  }
}

4. 实时监控

Elasticsearch 可以与 Beats 工具配合,实现系统资源的实时监控。

四、实战应用:电商商品搜索系统

我们将构建一个简单的电商平台商品搜索系统,展示 Elasticsearch 的完整应用流程。

1. 创建索引

PUT /products
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "name": { "type": "text" },
      "description": { "type": "text" },
      "price": { "type": "float" },
      "category": { "type": "keyword" },
      "tags": { "type": "keyword" }
    }
  }
}

2. 插入商品数据

POST /products/_doc/1
{
  "name": "iPhone 13",
  "description": "苹果最新款智能手机,搭载A15芯片,支持5G网络",
  "price": 6999,
  "category": "手机",
  "tags": ["5G", "iOS"]
}

POST /products/_doc/2
{
  "name": "小米12",
  "description": "小米旗舰手机,配备骁龙8 Gen 1处理器,支持无线充电",
  "price": 3999,
  "category": "手机",
  "tags": ["Android", "快充"]
}

3. 查询商品

GET /products/_search
{
  "query": {
    "match": {
      "name": "手机"
    }
  },
  "sort": [
    { "price": "desc" }
  ]
}

4. 多条件过滤

GET /products/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "name": "手机" }}
      ],
      "filter": [
        { "range": { "price": { "gte": 3000, "lte": 5000 } }}
      ]
    }
  }
}

5. 聚合统计

GET /products/_search
{
  "size": 0,
  "aggs": {
    "avg_price": { "avg": { "field": "price" } }
  }
}

五、总结

Elasticsearch 凭借其强大的搜索、聚合和分布式能力,已经成为现代大数据时代不可或缺的工具之一。无论是日志分析、全文检索还是实时数据分析,Elasticsearch 都能胜任。通过本文的讲解和实战示例,相信你已经掌握了 Elasticsearch 的基本使用方法,并能够将其应用到实际项目中去。

如果你正在开发一个需要高效搜索和数据分析的系统,不妨试试 Elasticsearch!🚀