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 的性能。

相关推荐
it噩梦12 小时前
elasticsearch中使用fuzzy查询
elasticsearch
喝醉酒的小白14 小时前
Elasticsearch相关知识@1
大数据·elasticsearch·搜索引擎
小小工匠16 小时前
ElasticSearch - 深入解析 Elasticsearch Composite Aggregation 的分页与去重机制
elasticsearch·composite·after_key·桶聚合分页
风_流沙16 小时前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch
TGB-Earnest17 小时前
【py脚本+logstash+es实现自动化检测工具】
大数据·elasticsearch·自动化
woshiabc1111 天前
windows安装Elasticsearch及增删改查操作
大数据·elasticsearch·搜索引擎
arnold661 天前
探索 ElasticSearch:性能优化之道
大数据·elasticsearch·性能优化
成长的小牛2331 天前
es使用knn向量检索中numCandidates和k应该如何配比更合适
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客1 天前
Elasticsearch:什么是查询语言?
大数据·数据库·elasticsearch·搜索引擎·oracle
启明真纳1 天前
elasticache备份
运维·elasticsearch·云原生·kubernetes