如何在 Windows 上安装 Elasticsearch 8.12.1

简介

本教程将指导您如何在 windows 系统上安装 Elasticsearch 8.12.1。Elasticsearch是一个分布式、RESTful风格的搜索和分析引擎,能够解决越来越多的用例。作为Elastic Stack的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。

前置要求

  • Windows 操作系统
  • 稳定的网络连接
  • 管理员权限
  • 至少4GB的可用RAM(生产环境推荐8GB或更多)
  • 至少2GB的可用磁盘空间
  • 已安装Java(对于Elasticsearch 7.0以上版本,已内置OpenJDK,无需单独安装)
  • Windows 7或更高版本

安装方法

使用ZIP压缩包安装

通过下载并解压ZIP文件安装Elasticsearch。

1. 下载ZIP压缩包

访问Elasticsearch官方网站下载适用于Windows的ZIP压缩包。

https://www.elastic.co/downloads/elasticsearch

选择Elasticsearch 8.12.1 的Windows ZIP版本。

2. 解压ZIP文件

将下载的ZIP文件解压到您选择的目录。

建议解压到不包含空格的路径,例如:C:\elasticsearch

3. 启动Elasticsearch

打开命令提示符或PowerShell,导航到Elasticsearch的bin目录并运行elasticsearch.bat。

cd C:\elasticsearch-${version}\bin
.\elasticsearch.bat

首次启动可能需要允许防火墙访问。

4. 配置为Windows服务(可选)

如果您希望将Elasticsearch作为Windows服务运行,可以使用elasticsearch-service.bat脚本。

cd C:\elasticsearch-${version}\bin
.\elasticsearch-service.bat install

安装服务后,您可以通过Windows服务管理器启动和停止Elasticsearch。

使用MSI安装程序(适用于Elasticsearch 7.x及以上版本)

通过官方MSI安装程序安装Elasticsearch。

1. 下载MSI安装程序

访问Elasticsearch官方网站下载适用于Windows的MSI安装程序。

https://www.elastic.co/downloads/elasticsearch

选择Elasticsearch 8.12.1 的Windows MSI版本。

2. 运行安装程序

双击下载的MSI文件,启动安装向导。

按照安装向导的指示完成安装。您可以选择安装位置和其他选项。

3. 配置服务

安装过程中,安装程序会自动将Elasticsearch配置为Windows服务。

默认情况下,服务设置为自动启动。

4. 启动服务

安装完成后,您可以通过Windows服务管理器或命令行启动Elasticsearch服务。

net start elasticsearch-service-x64

使用Docker安装

通过Docker容器运行Elasticsearch。

1. 安装Docker(如果尚未安装)

确保您的系统上已安装Docker。

https://docs.docker.com/desktop/install/windows-install/

请根据您的操作系统选择适当的Docker安装指南。

2. 拉取Elasticsearch Docker镜像

从Docker Hub拉取Elasticsearch镜像。

docker pull docker.elastic.co/elasticsearch/elasticsearch:8.12.1

这将下载指定版本的Elasticsearch Docker镜像。

3. 创建Docker网络(可选)

如果您计划运行Elastic Stack的多个组件,建议创建一个专用网络。

docker network create elastic

4. 运行Elasticsearch容器

启动Elasticsearch容器。

docker run -d --name elasticsearch --net elastic -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:8.12.1

这将在单节点模式下启动Elasticsearch,并将端口9200和9300映射到主机。

5. 验证容器运行状态

检查Elasticsearch容器是否正在运行。

docker ps
您应该看到elasticsearch容器在运行中。

验证安装

1. 检查Elasticsearch是否正在运行

使用curl或浏览器访问Elasticsearch的REST API端点。

curl -X GET "localhost:9200/"
{
  "name" : "node-1",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "...",
  "version" : {
    "number" : "7.15.0",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "...",
    "build_date" : "2021-09-02T09:17:55.291521Z",
    "build_snapshot" : false,
    "lucene_version" : "8.9.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

如果Elasticsearch正在运行,您将收到类似上面的JSON响应,包含版本信息和"You Know, for Search"标语。

2. 检查集群健康状态

检查Elasticsearch集群的健康状态。

curl -X GET "localhost:9200/_cluster/health?pretty"
{
  "cluster_name" : "elasticsearch",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 0,
  "active_shards" : 0,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

集群状态为"green"表示一切正常,"yellow"表示所有数据可用但某些副本未分配,"red"表示某些数据不可用。

3. 创建测试索引

创建一个测试索引来验证Elasticsearch的写入功能。

curl -X PUT "localhost:9200/test-index"
{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "test-index"
}

"acknowledged": true表示索引创建成功。

4. 索引一个测试文档

向测试索引中添加一个文档。

curl -X POST "localhost:9200/test-index/_doc" -H "Content-Type: application/json" -d'{
  "name": "测试文档",
  "description": "这是一个测试文档",
  "timestamp": "2023-01-01T12:00:00"
}'
{
  "_index" : "test-index",
  "_type" : "_doc",
  "_id" : "...",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

"result": "created"表示文档已成功创建。

5. 搜索测试文档

搜索刚刚创建的文档。

curl -X GET "localhost:9200/test-index/_search?pretty" -H "Content-Type: application/json" -d'{
  "query": {
    "match": {
      "name": "测试"
    }
  }
}'
{
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "test-index",
        "_type" : "_doc",
        "_id" : "...",
        "_score" : 1.0,
        "_source" : {
          "name" : "测试文档",
          "description" : "这是一个测试文档",
          "timestamp" : "2023-01-01T12:00:00"
        }
      }
    ]
  }
}

如果搜索结果中包含您刚刚创建的文档,则表示Elasticsearch的搜索功能正常工作。

基本使用示例

创建索引

创建一个新的Elasticsearch索引:

curl -X PUT "localhost:9200/my_index" -H "Content-Type: application/json" -d'{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "title": { "type": "text" },
      "content": { "type": "text" },
      "date": { "type": "date" },
      "status": { "type": "keyword" },
      "tags": { "type": "keyword" }
    }
  }
}'
{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "my_index"
}

这个示例创建了一个名为"my_index"的索引,设置了1个主分片和1个副本分片,并定义了文档的映射结构,包括不同类型的字段。

索引文档

向索引中添加文档:

curl -X POST "localhost:9200/my_index/_doc" -H "Content-Type: application/json" -d'{
  "title": "Elasticsearch入门指南",
  "content": "Elasticsearch是一个强大的搜索和分析引擎...",
  "date": "2023-01-15T12:00:00",
  "status": "published",
  "tags": ["elasticsearch", "搜索", "教程"]
}'
{
  "_index" : "my_index",
  "_type" : "_doc",
  "_id" : "abc123",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

这个示例向"my_index"索引中添加了一个包含标题、内容、日期、状态和标签的文档。Elasticsearch会自动生成一个ID,或者您可以在URL中指定ID。

基本搜索

执行基本的全文搜索:

curl -X GET "localhost:9200/my_index/_search?pretty" -H "Content-Type: application/json" -d'{
  "query": {
    "match": {
      "content": "elasticsearch 搜索"
    }
  }
}'
{
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.6931472,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "abc123",
        "_score" : 0.6931472,
        "_source" : {
          "title" : "Elasticsearch入门指南",
          "content" : "Elasticsearch是一个强大的搜索和分析引擎...",
          "date" : "2023-01-15T12:00:00",
          "status" : "published",
          "tags" : [
            "elasticsearch",
            "搜索",
            "教程"
          ]
        }
      }
    ]
  }
}

这个示例使用match查询在content字段中搜索包含"elasticsearch"或"搜索"的文档。Elasticsearch会返回匹配的文档,并按相关性评分排序。

复杂查询

使用布尔查询组合多个条件:

curl -X GET "localhost:9200/my_index/_search?pretty" -H "Content-Type: application/json" -d'{
  "query": {
    "bool": {
      "must": [
        { "match": { "content": "elasticsearch" } }
      ],
      "filter": [
        { "term": { "status": "published" } },
        { "range": { "date": { "gte": "2023-01-01" } } }
      ],
      "should": [
        { "term": { "tags": "教程" } }
      ]
    }
  }
}'

这个示例使用布尔查询组合了多个条件:必须包含"elasticsearch",必须是"published"状态,必须是2023年1月1日之后的文档,如果包含"教程"标签则提高相关性评分。

聚合分析

使用聚合功能进行数据分析:

curl -X GET "localhost:9200/my_index/_search?pretty" -H "Content-Type: application/json" -d'{
  "size": 0,
  "aggs": {
    "status_count": {
      "terms": { "field": "status" }
    },
    "tags_count": {
      "terms": { "field": "tags" }
    },
    "avg_date": {
      "avg": {
        "field": "date"
      }
    }
  }
}'
{
  "took" : 10,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 5,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "status_count" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "published",
          "doc_count" : 3
        },
        {
          "key" : "draft",
          "doc_count" : 2
        }
      ]
    },
    "tags_count" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "elasticsearch",
          "doc_count" : 5
        },
        {
          "key" : "搜索",
          "doc_count" : 3
        },
        {
          "key" : "教程",
          "doc_count" : 2
        }
      ]
    },
    "avg_date" : {
      "value" : 1673827200000,
      "value_as_string" : "2023-01-16T00:00:00.000Z"
    }
  }
}

这个示例使用聚合功能对数据进行分析,包括按状态和标签分组计数,以及计算日期的平均值。size设置为0表示不返回文档,只返回聚合结果。

更新文档

更新现有文档:

curl -X POST "localhost:9200/my_index/_update/abc123" -H "Content-Type: application/json" -d'{
  "doc": {
    "status": "updated",
    "tags": ["elasticsearch", "搜索", "教程", "更新"]
  }
}'
{
  "_index" : "my_index",
  "_type" : "_doc",
  "_id" : "abc123",
  "_version" : 2,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 1
}

这个示例更新了ID为"abc123"的文档,修改了status字段并添加了一个新标签。使用_update API可以只更新指定的字段,而不需要重新索引整个文档。

删除文档

删除文档:

curl -X DELETE "localhost:9200/my_index/_doc/abc123"
{
  "_index" : "my_index",
  "_type" : "_doc",
  "_id" : "abc123",
  "_version" : 3,
  "result" : "deleted",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 2,
  "_primary_term" : 1
}

这个示例删除了ID为"abc123"的文档。

批量操作

使用_bulk API执行批量操作:

curl -X POST "localhost:9200/_bulk" -H "Content-Type: application/json" -d'
{"index":{"_index":"my_index","_id":"1"}}
{"title":"文档1","content":"内容1","status":"published"}
{"index":{"_index":"my_index","_id":"2"}}
{"title":"文档2","content":"内容2","status":"draft"}
{"update":{"_index":"my_index","_id":"1"}}
{"doc":{"status":"updated"}}
{"delete":{"_index":"my_index","_id":"2"}}
'

这个示例使用_bulk API执行多个操作:索引两个新文档,更新第一个文档,然后删除第二个文档。批量操作可以显著提高处理大量文档时的性能。

常见问题

问题:elasticsearch command not found

解决方案:确保软件已正确安装并添加到系统PATH中。可能需要重启终端或系统。

问题:安装过程中遇到权限错误

解决方案:确保您有管理员权限。在Windows上以管理员身份运行命令提示符,在Mac/Linux上使用sudo。

问题:Elasticsearch无法启动,显示内存不足错误

解决方案:调整JVM堆大小设置。

# 编辑elasticsearch.yml文件
# 通常位于:
# Windows: config\elasticsearch.yml
# Linux/macOS: /etc/elasticsearch/elasticsearch.yml 或 config/elasticsearch.yml

# 添加或修改以下设置:
-Xms1g
-Xmx1g

# 这将JVM堆大小设置为1GB,根据您的系统资源调整这个值

问题:集群状态显示为黄色或红色

解决方案:检查集群健康状态并解决分片分配问题。

# 检查集群健康状态
GET _cluster/health

# 查看未分配的分片
GET _cat/shards?v&h=index,shard,prirep,state,unassigned.reason

# 对于测试环境,可以强制重新分配分片
POST _cluster/reroute?retry_failed=true

问题:磁盘空间不足

解决方案:清理旧索引或增加存储空间。

# 查看索引大小
GET _cat/indices?v&s=store.size:desc

# 删除旧索引
DELETE /old_index_name

# 或设置索引生命周期管理策略
PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {}
      },
      "delete": {
        "min_age": "30d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}

使用技巧

使用适当的分片数量:分片数量应该根据您的数据量和节点数量来确定。分片过多会增加开销,分片过少会限制扩展性。

优化映射:为您的数据设计合适的映射,选择正确的字段类型和分析器,可以显著提高搜索性能和准确性。

使用索引别名:通过索引别名可以无缝地切换索引,便于重建索引或版本升级。

定期监控集群健康:使用_cluster/health API定期检查集群状态,确保它保持在"green"状态。

实施索引生命周期管理:使用ILM(Index Lifecycle Management)自动管理索引,包括滚动更新、收缩和删除旧索引。

优化批量操作:使用_bulk API进行批量索引、更新或删除操作,而不是单独处理每个文档。

使用scroll API处理大结果集:当需要处理大量搜索结果时,使用scroll API而不是深度分页。

合理设置刷新间隔:根据您的用例调整refresh_interval设置,以平衡实时性和性能。

使用查询缓存:对于频繁执行的查询,启用查询缓存可以提高性能。

实施适当的备份策略:使用快照和恢复功能定期备份您的数据,以防数据丢失。

使用字段数据缓存:对于聚合和排序操作,合理配置字段数据缓存可以提高性能。

监控JVM堆使用情况:保持JVM堆使用率在50%以下,避免长时间的GC暂停。

使用适当的分析器:为不同语言和用例选择或自定义适当的分析器,以提高搜索质量。

相关资源

总结

恭喜!您已成功安装并配置了Elasticsearch 8.12.1。现在您可以开始使用这个强大的搜索和分析引擎来处理您的数据。随着您对Elasticsearch的深入了解,您将发现它在全文搜索、日志分析、应用监控等方面的强大功能。建议您继续探索Elastic Stack的其他组件,如Kibana、Logstash和Beats,以构建完整的数据处理解决方案。