文章摘要

文章介绍了Elasticsearch的基本概念和使用方法,帮助读者构建强大的搜索和分析引擎。内容涵盖Elasticsearch的安装与配置、核心概念(如索引、文档和节点)、基本操作(如数据索引、搜索和聚合),以及常见的使用场景。文章还提供了实践建议和优化技巧,帮助用户提升Elasticsearch的性能和效率。通过这篇指南,读者可以快速上手并有效利用Elasticsearch进行数据搜索和分析。

Elasticsearch是一个基于Lucene构建的开源搜索引擎,它可以快速地存储、搜索和分析大量数据。Elasticsearch通常用于全文搜索、日志分析和实时数据分析等场景。它是Elastic Stack的核心组件,Elastic Stack还包括Kibana(数据可视化工具)、Logstash(数据处理工具)和Beats(数据采集工具)等。

Elasticsearch 特点

  1. 分布式和高可用:Elasticsearch可以跨多个服务器分布存储数据,提供数据冗余和故障转移。
  2. 实时搜索:Elasticsearch支持近乎实时的搜索,这意味着数据被索引后很快就可以被搜索到。
  3. 多租户:可以在一个Elasticsearch集群中创建多个索引,每个索引可以被视为一个独立的搜索引擎。
  4. RESTful API:Elasticsearch提供了丰富的RESTful API,可以通过HTTP进行数据的索引、搜索、更新和删除操作。
  5. 灵活的数据模型:Elasticsearch不需要预先定义数据模式,它可以处理不同格式的数据,并且可以动态地调整数据结构。

使用场景

  1. 全文搜索:Elasticsearch最初被设计为一个搜索引擎,因此它非常适合用于需要全文搜索功能的应用,如电子商务网站、内容管理系统和应用程序内搜索。
  2. 日志和事件数据分析:Elasticsearch经常与Logstash和Kibana一起使用,作为ELK Stack(现在称为Elastic Stack)的一部分,用于收集、存储、搜索和分析日志文件。这对于运维监控、安全信息和事件管理(SIEM)等场景非常有用。
  3. 实时分析:Elasticsearch的近实时能力使其适合需要实时分析的应用,如监控应用程序、实时数据仪表板和实时推荐系统。
  4. 大数据分析:由于其分布式架构,Elasticsearch可以处理大规模的数据集,使其成为大数据分析的一个流行选择。
  5. 地理位置分析和搜索:Elasticsearch支持地理位置数据和查询,可以用于地图应用、地理位置搜索和地理空间分析。

优势

  1. 高性能:Elasticsearch能够快速地索引和检索数据,提供近实时的搜索体验。
  2. 可扩展性:Elasticsearch是分布式的,可以通过添加更多节点来水平扩展,以处理更多的数据和负载。
  3. 灵活性:Elasticsearch不需要预定义的数据模式,可以处理各种类型的结构化和非结构化数据。
  4. 强大的API:Elasticsearch提供了丰富的RESTful API,支持各种语言的客户端库,易于与现有应用集成。
  5. 成熟的生态系统:Elasticsearch是Elastic Stack的一部分,与Kibana、Logstash和Beats等工具集成,提供了从数据采集到可视化的完整解决方案。

不足

  1. 学习曲线:对于初学者来说,Elasticsearch的概念和功能可能有些复杂,需要一定的学习和实践才能熟练使用。
  2. 资源消耗:Elasticsearch对系统资源(如内存和CPU)的需求较高,尤其是在处理大量数据和复杂查询时。
  3. 管理复杂性:维护一个大型的Elasticsearch集群可能会比较复杂,需要对集群管理、监控和调优有一定的了解。
  4. 安全性:在默认配置下,Elasticsearch不提供认证和加密功能。虽然可以通过X-Pack等插件增加这些功能,但可能需要额外的配置和成本。
  5. 数据一致性:Elasticsearch是最终一致的,这意味着在某些情况下,数据可能不会立即在所有节点上同步更新。

安装

依赖java环境,请先自行安装jdk

在Mac上安装Elasticsearch,你可以选择使用Homebrew(一个包管理器),或者手动下载并安装。以下是两种安装方法的步骤:

使用Homebrew安装

如果你的Mac上安装了Homebrew,可以直接使用它来安装Elasticsearch。打开终端(Terminal)并执行以下命令:

  1. 首先,通过Homebrew添加Elasticsearch的官方Homebrew仓库:
brew tap elastic/tap
  1. 然后,使用Homebrew安装Elasticsearch:
brew install elastic/tap/elasticsearch-full

这将会安装最新版本的Elasticsearch。

  1. 安装完成后,你可以使用以下命令来启动Elasticsearch,让Elasticsearch作为服务运行
brew services start elastic/tap/elasticsearch-full

手动下载并安装

如果你不想使用Homebrew,可以手动下载Elasticsearch的tar.gz包进行安装。

  1. 访问Elasticsearch官方下载页面:https://www.elastic.co/cn/downloads/elasticsearch
  2. 下载适用于Mac的tar.gz压缩包。
  3. 打开终端,使用cd命令切换到下载文件所在的目录。
  4. 解压下载的文件:
tar -xzf elasticsearch-<version>-darwin-x86_64.tar.gz

请将<version>替换为你下载的Elasticsearch版本号。

  1. 进入解压后的Elasticsearch目录:
cd elasticsearch-<version>/
  1. 启动Elasticsearch:
./bin/elasticsearch

启动后,默认情况下,Elasticsearch会在本地的9200端口监听HTTP请求。

然后访问http://localhost:9200/看到如下输出,证明ES启动成功

注意事项

  • Elasticsearch需要Java环境,确保你的Mac上安装了Java。可以使用java -version命令来检查Java是否已安装。
  • 如果你在使用Elasticsearch时遇到权限问题,可能需要调整文件权限或者使用sudo命令。
  • Elasticsearch的默认配置文件位于config/elasticsearch.yml,你可以根据需要编辑这个文件来更改配置。

基本概念&操作

核心概念

  1. 节点(Node):一个节点是Elasticsearch集群中的一个单独的服务器。每个节点都参与集群的数据索引和查询操作。
  2. 集群(Cluster):一个集群是由多个节点组成的一个整体,这些节点共同工作,共享数据和负载。每个集群都有一个唯一的名称,这样节点就可以加入到正确的集群中。
  3. 索引(Index):索引是具有某些相似特征的文档集合。在关系数据库中,索引类似于数据库中的“表”。
  4. 类型(Type):在Elasticsearch 7.x之前的版本中,一个索引可以定义多个类型,类型是索引中的一个逻辑分区。从7.x版本开始,Elasticsearch已经废弃了类型的概念。
  5. 文档(Document):文档是可以被索引的信息的基本单位。在关系数据库中,文档类似于表中的“行”。
  6. 映射(Mapping):映射是定义文档如何存储和索引的过程,包括字段的名称和数据类型等。类似于关系数据库中的“表结构”。
  7. 分片(Shard):为了能够水平扩展和分布数据,索引可以被分割成多个分片。每个分片本身就是一个完整的索引。
  8. 副本(Replica):副本是分片的一个复制,用于提供数据冗余和提高查询性能。

基本操作

  1. 索引数据(Indexing):将数据存储到Elasticsearch中的过程称为索引。这通常通过HTTP POST或PUT请求完成。
  2. 搜索(Searching):Elasticsearch的核心功能之一是能够快速执行复杂的搜索操作。搜索可以通过HTTP GET请求和一个查询体(Query Body)来完成。
  3. 更新(Updating):更新操作允许你修改已经索引的文档。这通常通过HTTP POST请求完成。
  4. 删除(Deleting):你可以删除单个文档或整个索引。这通常通过HTTP DELETE请求完成。
  5. 聚合(Aggregations):聚合操作允许你基于搜索结果进行数据分析,如求和、计数、平均值等。

示例操作

以下是一些使用curl命令的基本Elasticsearch操作示例:

  • 索引一个文档
curl -X PUT "http://localhost:9200/my_index/_doc/1" -H 'Content-Type: application/json' -d'
{
  "title": "Elasticsearch Basics",
  "description": "Introduction to Elasticsearch concepts and operations."
}'
  • 搜索文档
curl -X GET "http://localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "title": "Basics"
    }
  }
}'
  • 更新文档
curl -X POST "http://localhost:9200/my_index/_doc/1/_update" -H 'Content-Type: application/json' -d'
{
  "doc": {
    "description": "Updated description."
  }
}'
  • 删除文档
curl -X DELETE "http://localhost:9200/my_index/_doc/1"
  • 聚合查询
curl -X GET "http://localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d'
{
  "size": 0,
  "aggs": {
    "avg_field": {
      "avg": {
        "field": "numeric_field"
      }
    }
  }
}'

相关链接:

https://www.elastic.co/guide/en/elasticsearch/reference/current/targz.html
https://qii404.me/2018/11/22/elastic-search.html
https://www.tizi365.com/archives/780.html

Github 开源地址

https://github.com/elastic/elasticsearch?tab=readme-ov-file