HOWTO · MongoDB

如何在 Windows 和 Ubuntu 上安装和使用 Elasticsearch 与 MongoDB

在 Windows 10 或 Ubuntu 20.04 上安装 Elasticsearch,在本地验证它,并了解如何将它与 MongoDB 搭配用于搜索。

本页内容

Elasticsearch 可以在 MongoDB 旁边运行,为选定的应用程序数据提供全文搜索。MongoDB 仍然是事实来源;应用程序或另一个集成进程必须将更改复制到 Elasticsearch 索引中。本指南介绍在 Windows 10 或 Ubuntu 20.04 上启动 Elasticsearch、检查其本地端点,以及 Node.js 集成所涉及的决策。

什么是 Elasticsearch

Elasticsearch 是一个建立在 Apache Lucene 之上的分布式搜索和分析引擎。它为 JSON 文档建立索引,以便应用程序可以搜索文本并筛选结构化字段。MongoDB 存储应用程序文档并支持通用查询;Elasticsearch 维护一个单独的、为检索优化的搜索索引。它不是 MongoDB 的替代品,并且这两个存储不会自动同步。

索引是派生数据。请规划如何最初填充它、如何传播后续的插入、更新和删除,以及当它落后或其映射发生变化时如何重建它。

在 Windows 10 上安装 Elasticsearch

  1. 选择一个支持该 Windows 版本以及该发行版所述 Java 运行时要求的 Elasticsearch 发行版。官方存档可能包含捆绑的 JDK;在单独安装 Java 之前,请查看该发行版的安装说明。不要依赖旧的 Java 7 或 Java 8 最低要求作为一般要求。
  2. 从 Elastic 官方 Elasticsearch 下载页面下载 Windows 存档,并将其解压到您的账户可写的目录中。存档布局和安全默认值因发行版而异。
  3. 在解压后的 Elasticsearch bin 目录中打开命令提示符或 PowerShell,并启动 elasticsearch.bat。在前台进程运行时保持该窗口打开。对于持久服务,请使用为所选发行版记录的服务设置,而不是将前台窗口视为服务安装。
  4. 保持该发行版的安全功能启用。Elasticsearch 8 及更高版本默认启用安全功能;请使用生成的凭据或配置适当的用户和 TLS 设置。不要在可通过网络访问的实例上设置 xpack.security.enabled: false。禁用安全功能仅适用于没有不可信网络访问的隔离本地实验。
  5. 在浏览器中检查 http://localhost:9200,或使用 curl 请求它。一个健康的受保护节点可能会要求提供凭据或返回身份验证响应;这仍然表明端点可达。请使用在设置过程中打印或配置的凭据和 HTTPS 详细信息。

如果端点没有响应,请检查启动窗口中是否有引导或配置错误,确认进程仍在运行,并验证另一个进程没有在使用端口 9200。

在 Ubuntu 20.04 上安装 Elasticsearch

  1. 选择一个其支持和软件包要求包含 Ubuntu 20.04 的发行版。打开 Elastic 官方 APT 安装指南,并按照您所选发行版的存储库和签名密钥步骤操作。这些步骤将 APT 配置为信任 Elastic 的软件包签名密钥,并从 Elastic 的存储库中检索软件包。基于 apt-key 的旧说明已弃用;请使用指南中显示的密钥环方法。Elasticsearch 软件包通常包含合适的捆绑 JDK,因此仅当所选发行版的说明要求时,才安装单独的 Java 软件包。
  2. 为所选发行版配置存储库后,使用 sudo apt-get update 刷新 APT 的软件包索引,然后使用 sudo apt-get install elasticsearch 安装 Elasticsearch。如果您需要可重复的部署,请使用 apt-cache madison elasticsearch 检查该存储库中可用的版本,并使用 sudo apt-get install elasticsearch=<package-version> 安装确切的软件包版本。请使用 APT 报告的版本字符串;存储库行和可用版本取决于在 Elastic 指南中选择的发行版。
  3. 使用 sudo systemctl enable --now elasticsearch.service 启动并启用该服务。使用 sudo systemctl status elasticsearch.service 检查它;如果启动失败,请检查服务日志或 /var/log/elasticsearch/。
  4. 主要配置通常是 /etc/elasticsearch/elasticsearch.yml。保持身份验证和传输安全启用,并审慎地配置网络暴露。单节点设置并不自动就可以安全地公开暴露。
  5. 使用您发行版的凭据和证书设置检查 https://localhost:9200。证书警告可能意味着本地 CA 不受客户端信任;请验证证书或将客户端配置为信任生成的 CA,而不是禁用验证。

成功的本地响应确认 Elasticsearch 正在运行。它并不确认 MongoDB 记录正在被索引。

为什么将 Elasticsearch 与 MongoDB 一起使用

MongoDB 通常是应用程序记录的权威存储,而 Elasticsearch 则为单独维护的索引提供搜索。这种搭配可以提供全文搜索,而无需使搜索索引成为数据的唯一副本。搜索结果可能会落后于 MongoDB,因此需要即时一致性的应用程序应考虑这一延迟。

Node.js 集成需要一个 MongoDB 更改来源、一个与所选服务器版本兼容的 Elasticsearch 客户端,以及一个明确的索引策略。典型的流程是读取现有记录以建立初始索引,使用从其 MongoDB _id 派生的稳定文档 ID 将每条记录写入 Elasticsearch,然后在插入、更新和删除发生时应用它们。使写入可重试且幂等,记录失败以便重放,并提供一种核对或重建索引的方法。检查 MongoDB 中的一个示例文档,并查询相应的 Elasticsearch 文档以验证双方。

以下 Node.js 示例展示了从 MongoDB 记录到 Elasticsearch 文档 ID 和 JSON 正文的确定性映射。它在没有任一服务的情况下运行;它仅演示负载的形状,而不是数据库写入或同步。

const mongoRecord = {
  _id: "product-42",
  name: "Trail shoes",
  category: "footwear"
};

const elasticsearchDocument = {
  id: String(mongoRecord._id),
  document: {
    name: mongoRecord.name,
    category: mongoRecord.category
  }
};

console.log(JSON.stringify(elasticsearchDocument, null, 2));
{
  "id": "product-42",
  "document": {
    "name": "Trail shoes",
    "category": "footwear"
  }
}

要在应用程序中使用这种形状,请通过维护中的 Elasticsearch 客户端将 id 作为 Elasticsearch 文档 ID 发送,并将 document 作为其来源。将该写入连接到应用程序的 MongoDB 更改处理,并明确处理重试和删除。该示例并不证明某个特定的客户端、插件或 Elasticsearch 发行版是兼容的。

原始的 mongoosastic 示例依赖于一个遗留的 Mongoose 插件和一个兼容的 Elasticsearch 客户端。它与当前 Elasticsearch 发行版的兼容性在此并未得到证实,因此不要将该代码片段或其成功消息视为已验证的集成。在采用它之前,请确认该插件支持您项目中确切的 Mongoose 和 Elasticsearch 版本。对于新的集成,请使用维护中的客户端,并遵循其针对特定版本的索引和更改流指南;仅凭一个基本的保存回调并不能证明索引已完成。