elasticsearch实战应用

elasticsearch实战应用

Elasticsearch 是一个基于 Lucene 的开源分布式搜索引擎,主要用于全文搜索、结构化搜索、分析和数据存储。它广泛应用于日志分析、数据可视化、推荐系统等场景。以下是 Elasticsearch 在实际项目中的常见应用和操作指南。

1. Elasticsearch 核心概念

1.1 核心术语
  • 索引(Index):类似于关系型数据库中的数据库,存储数据的逻辑空间。一个索引可以包含多个文档。
  • 类型(Type):以前用于将不同类别的文档组织在同一个索引下,现在不推荐使用。
  • 文档(Document):存储在索引中的数据实体,类似于关系型数据库中的行。
  • 字段(Field):文档中的属性,类似于关系型数据库中的列。
  • 分片(Shard):索引的物理存储单元。每个索引可以拆分为多个分片,分散存储以实现分布式架构。
  • 副本(Replica):每个分片的备份副本,用于提高查询速度和故障恢复能力。
1.2 数据结构

Elasticsearch 的数据以 JSON 格式存储,每个文档是 JSON 对象。示例如下:

json 复制代码
{
  "user": "Alice",
  "message": "Elasticsearch is a powerful search engine",
  "post_date": "2024-09-22T14:12:12",
  "likes": 100
}

2. Elasticsearch 安装与配置

2.1 Docker 安装

使用 Docker 快速安装 Elasticsearch:

bash 复制代码
docker pull elasticsearch:8.9.0
docker run -d --name elasticsearch -p 9200:9200 -e "discovery.type=single-node" elasticsearch:8.9.0
2.2 基本配置

Elasticsearch 配置文件通常位于 /etc/elasticsearch/elasticsearch.yml,以下是常见配置选项:

  • cluster.name: 集群的名称,用于标识一个 Elasticsearch 集群。
  • node.name: 每个节点的名称。
  • network.host: 绑定的 IP 地址。
  • http.port: 提供 HTTP 服务的端口,默认为 9200

3. 创建索引和文档操作

3.1 创建索引

在 Elasticsearch 中,创建索引是存储数据的第一步。你可以通过 REST API 创建索引:

bash 复制代码
PUT /my_index
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  }
}

这将创建一个名为 my_index 的索引,包含 3 个主分片和 2 个副本分片。

3.2 插入文档

使用 POST 请求插入文档:

bash 复制代码
POST /my_index/_doc/1
{
  "user": "Alice",
  "message": "Learning Elasticsearch",
  "post_date": "2024-09-22T14:12:12",
  "likes": 10
}
  • /my_index/_doc/1:表示在 my_index 索引中插入文档,文档 ID 为 1
3.3 获取文档

通过文档 ID 获取文档内容:

bash 复制代码
GET /my_index/_doc/1

返回结果类似于:

json 复制代码
{
  "_index": "my_index",
  "_type": "_doc",
  "_id": "1",
  "_source": {
    "user": "Alice",
    "message": "Learning Elasticsearch",
    "post_date": "2024-09-22T14:12:12",
    "likes": 10
  }
}
3.4 更新文档

通过 POST 请求更新文档:

bash 复制代码
POST /my_index/_update/1
{
  "doc": {
    "likes": 20
  }
}
3.5 删除文档

通过文档 ID 删除文档:

bash 复制代码
DELETE /my_index/_doc/1

4. 搜索与查询

Elasticsearch 强大的地方在于它的搜索能力。支持多种搜索方式,包括全文检索、结构化查询、模糊查询等。

4.1 简单查询

使用 match 查询:

bash 复制代码
GET /my_index/_search
{
  "query": {
    "match": {
      "message": "Elasticsearch"
    }
  }
}
4.2 布尔查询(Bool Query)

使用 bool 查询可以组合多个查询条件:

bash 复制代码
GET /my_index/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "user": "Alice" }},
        { "range": { "likes": { "gte": 10 }}}
      ]
    }
  }
}
  • must: 匹配所有条件。
  • should: 匹配至少一个条件。
  • filter: 进行过滤查询,不影响评分。
4.3 词语查询与短语查询
  • Term Query:用于精确匹配字段值,通常用于关键字字段。
bash 复制代码
GET /my_index/_search
{
  "query": {
    "term": {
      "user": "Alice"
    }
  }
}
  • Phrase Query:用于匹配包含特定短语的文档。
bash 复制代码
GET /my_index/_search
{
  "query": {
    "match_phrase": {
      "message": "powerful search engine"
    }
  }
}
4.4 范围查询

使用 range 查询范围:

bash 复制代码
GET /my_index/_search
{
  "query": {
    "range": {
      "post_date": {
        "gte": "2024-09-01",
        "lte": "2024-09-30"
      }
    }
  }
}
4.5 聚合查询

Elasticsearch 还支持数据聚合,如计数、求和、平均值等。以下是按 likes 字段进行平均值聚合的例子:

bash 复制代码
GET /my_index/_search
{
  "size": 0,
  "aggs": {
    "avg_likes": {
      "avg": {
        "field": "likes"
      }
    }
  }
}

返回结果:

json 复制代码
{
  "aggregations": {
    "avg_likes": {
      "value": 15.0
    }
  }
}

5. 实战场景应用

5.1 日志分析平台

使用 Elasticsearch、Logstash、Kibana(ELK Stack)搭建日志分析平台。日志从服务器收集后通过 Logstash 解析并存入 Elasticsearch,然后通过 Kibana 实现日志的实时分析和可视化。

  • Logstash:负责采集、过滤和传输数据。
  • Elasticsearch:负责存储和搜索数据。
  • Kibana:负责可视化展示数据。
5.2 全文搜索引擎

Elasticsearch 可用于构建高效的全文搜索引擎,支持复杂的查询组合、相关性评分和自动补全等功能。可以通过自定义分词器提升搜索精度。

5.3 实时推荐系统

Elasticsearch 的快速查询能力适合用于构建推荐系统。可以将用户行为数据实时存入 Elasticsearch,并根据查询条件进行个性化推荐,例如基于用户的点击记录进行商品推荐。

6. 性能优化

6.1 分片和副本设置
  • 分片数量:分片太少会导致数据分布不均匀,分片太多会增加管理成本。根据数据规模和查询并发设置合理的分片数。
  • 副本设置:增加副本可以提高查询速度和容错性,但会消耗更多的存储资源。
6.2 文档结构优化
  • 减少嵌套结构:过于复杂的嵌套结构会影响查询性能。
  • 字段映射:提前定义好字段类型和分析器,避免动态映射带来的额外开销。
6.3 搜索查询优化
  • 使用 filter 查询filter 查询不会计算相关性评分,适合对性能要求高的场景。
  • 分页查询 :如果查询结果过大,使用 fromsize 来分页数据,避免一次返回大量数据。

7. 总结

Elasticsearch 是一个强大且灵活的分布式搜索引擎,适合各种实时数据搜索和分析场景。它广泛应用于日志分析、全文搜索、推荐系统和数据可视化等领域。通过合理设计索引、优化查询、调整分片与副本设置,可以充分发挥 Elasticsearch 的性能。

相关推荐
老纪的技术唠嗑局9 小时前
告别OpenClaw配置丢失——Mindkeeper内测版邀测
大数据·elasticsearch·搜索引擎
Elasticsearch9 小时前
使用 Elasticsearch + Jina embeddings 进行无监督文档聚类
elasticsearch
勇哥的编程江湖12 小时前
flinkcdc streaming 同步数据到es记录过程
大数据·elasticsearch·flink·flinkcdc
曾阿伦12 小时前
Elasticsearch 7.x 常用命令备忘录
大数据·elasticsearch·搜索引擎
斯特凡今天也很帅13 小时前
Elasticsearch数据库专栏(二)DSL语句总结(更新中)
大数据·elasticsearch·搜索引擎
要记得喝水13 小时前
适用于 Git Bash 的脚本,批量提交和推送多个仓库的修改
git·elasticsearch·bash
二十七剑13 小时前
Elasticsearch的索引问题
大数据·elasticsearch·搜索引擎
A__tao21 小时前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
A__tao1 天前
Elasticsearch Mapping 一键生成 Proto 文件(支持嵌套 + 注释过滤)
大数据·elasticsearch·jenkins
Devin~Y1 天前
高并发电商与AI智能客服场景下的Java面试实战:从Spring Boot到RAG与向量数据库落地
java·spring boot·redis·elasticsearch·spring cloud·kafka·rag