使用 Node.js 和 Azure Function App 自动更新 Elasticsearch 索引

作者:来自 Elastic Jessica Garson

维护最新数据至关重要,尤其是在处理频繁变化的动态数据集时。这篇博文将指导你使用 Node.js 加载数据,并通过定期更新确保数据保持最新。我们将利用 Azure Function Apps 的功能来自动执行这些更新,从而确保你的数据集始终是最新且可靠的。

对于这篇博文,我们将使用 Near Earth Object Web 服务 (NeoWs),这是一种 RESTful Web 服务,提供有关近地小行星的详细信息。通过将 NeoWs 与作为 Azure 无服务器函数集成的 Node.js 服务集成,此示例将为你提供一个强大的框架来有效处理管理动态数据的复杂性。这种方法将帮助你最大限度地降低使用过时信息的风险,并最大限度地提高数据的准确性和实用性。

先决条件

  • 此示例使用 Elasticsearch 版本 8.13;如果你是 Elasticsearch 新手,请查看我们的 Elasticsearch 快速入门。任何 8.0 版本都适用于此博客文章。
  • 下载最新的 NPM 和 Node.js 版本。本教程使用 Node v21.6.1 和 npm 10.5.0。
  • NASA API 的 API 密钥。
  • 具有创建 Function App 权限的有效 Azure 帐户。
  • 访问 Azure 门户或 Azure CLI

本地设置

在开始索引和本地加载数据之前,设置环境至关重要。首先,创建一个目录并初始化它。然后,下载必要的软件包并创建一个 .env 文件来存储你的配置设置。此初步设置可确保你的本地环境已准备好有效处理数据。

mkdir Introduction-to-Data-Loading-in-Elasticsearch-with-Nodejs
cd Introduction-to-Data-Loading-in-Elasticsearch-with-Nodejs
npm init

你将使用 Elasticsearch nodejs 客户端连接到 Elastic,使用 Axios 连接到 NASA API,使用 dotenv 解析你的凭据(secrets)。你需要运行以下命令下载所需的软件包:

npm install @elastic/elasticsearch axios dotenv

下载所需的软件包后,你可以在项目目录的根目录中创建一个 .env 文件。.env 文件允许你在本地保护你的凭据。查看示例 .env 文件以了解更多信息。要了解有关连接到 Elasticsearch 的更多信息,请务必查看有关该主题的文档。

要创建 .env 文件,你可以在项目根目录中使用此命令:

touch .env

在你的 .env 中,请确保输入以下内容。请确保添加完整的端点:

ELASTICSEARCH_ENDPOINT="https://...."
ELASTICSEARCH_API_KEY="YOUR_ELASTICSEARCh_API_KEY"
NASA_API_KEY="YOUR_NASA_API_KEY"

你还需要创建一个新的 JavaScript 文件:

touch loading_data_into_a_index.js

创建索引并加载数据

现在你已经设置了正确的文件结构并下载了所需的包,你可以创建一个脚本来创建索引并将数据加载到索引中。如果你在此过程中遇到困难,请务必查看本节中创建的文件的完整版本。

在文件 loading_data_into_a_index.js 中,配置 dotenv 包以使用存储在 .env 文件中的密钥和令牌。你还应该导入 Elasticsearch 客户端以连接到 Elasticsearch 和 Axios 并发出 HTTP 请求。

require('dotenv').config();const { Client } = require('@elastic/elasticsearch');
const axios = require('axios');

由于你的密钥和令牌当前存储为环境变量,你将需要检索它们并创建客户端来向 Elasticsearch 进行身份验证。

const elasticsearchEndpoint = process.env.ELASTICSEARCH_ENDPOINT;
const elasticsearchApiKey = process.env.ELASTICSEARCH_API_KEY;
const nasaApiKey = process.env.NASA_API_KEY;const client = new Client({node: elasticsearchEndpoint,auth: {apiKey: elasticsearchApiKey}
});

你可以开发一个函数来异步检索 NASA 的 NEO(Near Earth Object - 近地天体)Web 服务中的数据。首先,你需要为 NASA API 请求配置基本 URL,并创建今天和上周的日期对象以建立查询周期。将这些日期格式化为 API 请求所需的 YYYY-MM-DD 格式后,将日期设置为查询参数并向 NASA API 执行 GET 请求。此外,该函数还包括错误处理机制,以便在出现任何问题时帮助进行调试。

async function fetchNasaData() {const url = "https://api.nasa.gov/neo/rest/v1/feed";const today = new Date();const lastWeek = new Date(today);lastWeek.setDate(today.getDate() - 7);const startDate = lastWeek.toISOString().split('T')[0];const endDate = today.toISOString().split('T')[0];const params = {api_key: nasaApiKey,start_date: startDate,end_date: endDate,};try {const response = await axios.get(url, { params });return response.data;} catch (error) {console.error('Error fetching data from NASA:', error);return null;}
}

现在,你可以创建一个函数,将 NASA API 中的原始数据转换为结构化格式。由于你返回的数据目前嵌套在复杂的 JSON 响应中。更直接的对象数组使处理数据变得更容易。

function createStructuredData(response) {const allObjects = [];const nearEarthObjects = response.near_earth_objects;Object.keys(nearEarthObjects).forEach(date => {nearEarthObjects[date].forEach(obj => {const simplifiedObject = {close_approach_date: date,name: obj.name,id: obj.id,miss_distance_km: obj.close_approach_data.length > 0 ? obj.close_approach_data[0].miss_distance.kilometers : null,};allObjects.push(simplifiedObject);});});return allObjects;
}

你将需要创建一个索引来存储来自 API 的数据。Elasticsearch 中的索引是你可以将数据存储在文档中的地方。在此函数中,你将检查索引是否存在,并在需要时创建一个新索引。你还将为索引指定正确的字段映射。此函数还将数据作为文档加载到索引中,并将 NASA 数据中的 id 字段映射到 Elasticsearch 中的 _id 字段。

async function indexDataIntoElasticsearch(data) {const indexExists = await client.indices.exists({ index: 'nasa-node-js' });if (!indexExists.body) {await client.indices.create({index: 'nasa-node-js',body: {mappings: {properties: {close_approach_date: { type: 'date' },name: { type: 'text' },miss_distance_km: { type: 'float' },},},},});}const body = data.flatMap(doc => [{ index: { _index: 'nasa-node-js', _id: doc.id } }, doc]);await client.bulk({ refresh: false, body });
}

你需要创建一个主函数来获取、构造和索引数据。此函数还将打印出正在上传的记录数,并记录数据是否已编入索引、是否没有要编入索引的数据,或者是否无法从 NASA API 获取数据。创建 run 函数后,你需要调用该函数并捕获可能出现的任何错误。

async function run() {const rawData = await fetchNasaData();if (rawData) {const structuredData = createStructuredData(rawData);console.log(`Number of records being uploaded: ${structuredData.length}`);if (structuredData.length > 0) {await indexDataIntoElasticsearch(structuredData);console.log('Data indexed successfully.');} else {console.log('No data to index.');}} else {console.log('Failed to fetch data from NASA.');}
}run().catch(console.error);

你现在可以通过运行以下命令从命令行运行该文件:

node loading_data_into_a_index.js

要确认你的索引已成功加载,你可以通过执行以下 API 调用来检查 Elastic Dev Tools:

GET /nasa-node-js/_search

使用 Azure 函数应用程序保持数据更新

现在你已成功将数据加载到本地索引中,但这些数据很快就会过时。为确保你的信息保持最新,你可以设置 Azure 函数应用程序以自动每天获取新数据并将其上传到 Elasticsearch 索引。

第一步是在 Azure 门户中配置你的函数应用程序。Azure 快速入门指南是入门的有用资源。

设置函数后,你可以确保已为 ELASTICSEARCH_ENDPOINT、ELASTICSEARCH_API_KEY 和 NASA_API_KEY 设置环境变量。在函数应用程序中,环境变量称为应用程序设置(Application settings)。在函数应用程序中,单击左侧面板中 “Configuration” 下的 “Settings” 选项。在 “Application settings” 选项卡下,单击“+ New application setting”。

你还需要确保安装了所需的库。如果你转到 Azure 门户上的终端,可以通过输入以下内容来安装必要的软件包:

npm install @elastic/elasticsearch axios

你正在安装的软件包看起来应该与之前的安装非常相似,只是你将使用 moment 来解析日期,并且你不再需要加载 env 文件,因为你只需将 secrets 设置为应用程序设置即可。

你可以单击 create 的位置以在函数应用程序中创建新函数,选择名为 “Timer trigger”” 的模板。现在你将拥有一个名为 function.json 的文件。你需要将其调整为如下所示,以便每天上午 10 点运行此应用程序。

{"bindings": [{"name": "myTimer","type": "timerTrigger","direction": "in","schedule": "0 0 10 * * *"}]}

你还需要上传 package.json 文件并确保其显示如下:

{"name": "introduction-to-data-loading-in-elasticsearch-with-nodejs","version": "1.0.0","description": "A simple script for loading data in Elasticsearch","main": "loading_data_into_a_index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"repository": {"type": "git","url": "git+https://github.com/JessicaGarson/Introduction-to-Data-Loading-in-Elasticsearch-with-Nodejs.git"},"author": "Jessica Garson","license": "Apache-2.0","bugs": {"url": "https://github.com/JessicaGarson/Introduction-to-Data-Loading-in-Elasticsearch-with-Nodejs/issues"},"homepage": "https://github.com/JessicaGarson/Introduction-to-Data-Loading-in-Elasticsearch-with-Nodejs#readme","dependencies": {"@elastic/elasticsearch": "^8.12.0","axios": "^0.21.1"}
}

下一步是创建一个 index.js 文件。此脚本旨在每天自动更新数据。它通过每天系统地获取和解析新数据,然后无缝地更新数据集来实现这一点。Elasticsearch 可以使用相同的方法来提取时间序列或不可变数据,例如 webhook 响应。此方法可确保信息保持最新和准确,反映最新的可用数据。你也可以查看完整代码。

你在本地运行的脚本与此脚本之间的主要区别如下:

  • 你不再需要加载 .env 文件,因为你已经设置了环境变量
  • 还有不同的日志记录,更多旨在创建更可持续的脚本
  • 你可以根据最近的收盘价日期保持索引更新
  • 有一个 Azure 函数应用程序的入口点

你首先需要设置库并向 Elasticsearch 进行身份验证,如下所示:

const elasticsearchEndpoint = process.env.ELASTICSEARCH_ENDPOINT;
const elasticsearchApiKey = process.env.ELASTICSEARCH_API_KEY;
const nasaApiKey = process.env.NASA_API_KEY;const client = new Client({node: elasticsearchEndpoint,auth: {apiKey: elasticsearchApiKey}
});

之后,你将需要从 Elasticsearch 获取最新的更新日期,并配置备份方法以便在出现任何问题时获取过去一天的数据。

async function getLastUpdateDate() {try {const response = await client.search({index: 'nasa-node-js',body: {size: 1,sort: [{ close_approach_date: { order: 'desc' } }],_source: ['close_approach_date']}});if (response.body && response.body.hits && response.body.hits.hits.length > 0) {return response.body.hits.hits[0]._source.close_approach_date;} else {// Default to one day ago if no records foundconst today = new Date();const lastWeek = new Date(today);lastWeek.setDate(today.getDate() - 1);return lastWeek.toISOString().split('T')[0];}} catch (error) {console.error('Error fetching last update date from Elasticsearch:', error);throw error;}
}

以下函数连接到 NASA 的 NEO(近地天体)Web 服务以获取数据,使你的索引保持更新。还有一些额外的错误处理功能,可以捕获可能出现的任何 API 错误。

async function fetchNasaData(startDate) {const url = "https://api.nasa.gov/neo/rest/v1/feed";const today = new Date();const endDate = today.toISOString().split('T')[0];const params = {api_key: nasaApiKey,start_date: startDate,end_date: endDate,};try {// Perform the GET request to the NASA API with query parametersconst response = await axios.get(url, { params });return response.data;} catch (error) {// Log any errors encountered during the requestconsole.error('Error fetching data from NASA:', error);return null;}
}

现在,你将需要创建一个函数,通过迭代每个日期的对象来组织数据。

function createStructuredData(response) {const allObjects = [];const nearEarthObjects = response.near_earth_objects;Object.keys(nearEarthObjects).forEach(date => {nearEarthObjects[date].forEach(obj => {const simplifiedObject = {close_approach_date: date,name: obj.name,id: obj.id,miss_distance_km: obj.close_approach_data.length > 0 ? obj.close_approach_data[0].miss_distance.kilometers : null,};allObjects.push(simplifiedObject);});});return allObjects;
}

现在,你需要使用批量(bulk)索引操作将数据加载到 Elasticsearch 中。此功能应与上一节中的功能类似。

async function indexDataIntoElasticsearch(data) {const body = data.flatMap(doc => [{ index: { _index: 'nasa-node-js', _id: doc.id } }, doc]);await client.bulk({ refresh: false, body });
}

最后,你需要为将根据你设置的计时器运行的函数创建一个入口点。此函数类似于主函数​​,因为它调用文件中先前创建的函数。还有一些额外的日志记录,例如打印记录数并通知你数据是否已正确编入索引。

module.exports = async function (context, myTimer) {try {const lastUpdateDate = await getLastUpdateDate();context.log(`Last update date from Elasticsearch: ${lastUpdateDate}`);const rawData = await fetchNasaData(lastUpdateDate);if (rawData) {const structuredData = createStructuredData(rawData);context.log(`Number of records being uploaded: ${structuredData.length}`);if (structuredData.length > 0) {const flatFileData = JSON.stringify(structuredData, null, 2);context.log('Flat file data:', flatFileData);await indexDataIntoElasticsearch(structuredData);context.log('Data indexed successfully.');} else {context.log('No data to index.');}} else {context.log('Failed to fetch data from NASA.');}} catch (error) {context.log('Error in run process:', error);}

结论

使用 Node.js 和 Azure 的 Function App,你应该能够确保你的索引定期更新。通过结合使用 Node.js 的功能和 Azure 的 Function App,你可以有效地维护索引的定期更新。这种强大的组合提供了一个简化的自动化流程,减少了定期更新索引所需的手动工作量。此示例的完整代码可在 Search Labs GitHub 上找到。如果你基于此博客构建了任何内容,或者你对我们的论坛和社区 Slack 频道有疑问,请告诉我们。

准备好自己尝试一下了吗?开始免费试用。
想要获得 Elastic 认证吗?了解下一次 Elasticsearch 工程师培训何时举行!

原文:Elasticsearch index updates: Automatically update your index using Node.js and an Azure Function App — Elastic Search Labs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/848139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云计算百科:类型、服务与业务优势一网打尽

了解云计算的权威指南是至关重要的,掌握云计算的类型、服务、用途以及它们如何为组织带来好处尤为重要。 假设某公司的员工正在办公室工作,突然间火警响起,原来IT部门的主服务器机房着火了,所有服务器都受到了影响。这一消息引发…

新一代企业共享服务中心,开启企业智慧管理决策新纪元

随着数字化浪潮加速来袭,企业面临着与以往全然不同的挑战与机遇。 业务与人员的增长致使服务请求与日俱增,业务类型愈加复杂,大量来自不同业务线的服务请求使内部服务压力增加。业务激增后只得依赖更多资源投入,势必掣肘服务效率。…

CSS函数: 实现数据限阈的数字函数

CSS函数中提供了几个比较实用的数字函数,它可以帮助我们实现一定的数学计算功能。常见的数字函数目前提供了五个:calc()、max()、min()和clamp()函数。其基本实现功能如下: calc():允许在声明 CSS 属性值时执行一些计算。max()&a…

eNSP学习——配置RIPv2认证

目录 主要命令 原理概述 实验目的 实验内容 实验拓扑 实验编址 实验步骤 1、基本配置 2、搭建RIP网络 3、模拟网络攻击 4、配置RIPv2简单验证 5、配置RIPv2 MD5密文验证 需要eNSP各种配置命令的点击链接自取:华为eNSP各种设备配置命令大全PD…

通过LabVIEW提升生产设备自动化水平

现代制造业对生产设备的自动化水平提出了越来越高的要求。使用LabVIEW这一强大的图形化编程环境,可以显著提升生产设备的自动化程度,改善生产效率和产品质量。本文将详细分析如何通过LabVIEW改善生产设备的自动化水平,并提供具体的实施策略与…

SpringBoot社区配送服务系统小程序-计算机毕业设计源码88705

摘要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,社区当然也不例外。社区配送服务系统小程序是以实际运用为开发背景,运用软件工程原理和开发方法,采…

alist配合onlyoffice 实现在线预览

alist配合onlyoffice 实现在线预览 文章目录 alist配合onlyoffice 实现在线预览一、安装onlyoffice二、增加view.html文件三、安装nginx,并增加conf配置文件四、alist预览配置增加 一、安装onlyoffice 我是采用docker安装,采用的版本是7.2, …

安装Acunetix

Acunetix是一个自动化的Web应用程序安全测试工具,可以扫描任何可通过Web浏览器访问的和遵循HTTP/HTTPS规则的Web站点和Web应用程序,提供全面的漏洞扫描服务,并生成响应的报告 # 1. 安装 代码语言:javascript 复制 [rootwhcode…

高效管理近30万稳定运力,科技物流企业万联易达这样做

万联易达物流科技有限公司(以下简称“万联易达”),是由中泽集团投资设立的创新型物流科技企业。为提高平台数智化服务水平,提升业务开展效率,达到运输全场景合规化管理,万联易达平台引用法大大电子合同&…

在iPad上恢复丢失数据的3方法

iPad概览 iPad不仅可以用来看电影,还可以用来工作和学习。使用 Apple Pencil,您可以在 iPad 上做笔记、画画、制作音乐、编辑视频和在课堂上教学等。同时,由于体积小,您可以在商务旅行中轻松随身携带。因此,iPad已成为…

【成品设计】基于华大hc32F005c6ua的读取NFC卡

《基于华大hc32F005c6ua的读取NFC卡》 整体功能: 单片机:华大hc32F005c6ua 1、支持单片机spi接口读取nfc读卡器芯片rc522读写数据 2、读取到的数据可以通过单片机uart接口通信,上报给上位机(485主机) 3、uart接口支持modbus协议…

IntelliJ IDEA智能编程插件AI Assistant

IntelliJ IDEA集成开发工具最新版本提供了人工智能AI编程助手的插件,AI Assistant使用手册的文档地址是AI Assistant | IntelliJ IDEA Documentation AI Assistant提供以下的编程能力以及工具特性: 与AI Assistant聊天,提问与项目相关或者与…

门外汉一次过软考中级(系统集成项目管理工程师)秘笈,请收藏!

24上软考考试已经结束,24下软考备考又要开启了!今年软考发生了改革,很多考试由一年考两次变成了一年考一次,比如高级信息系统项目管理师,比如中级系统集成项目管理工程师,这两科是高、中级里相对简单&#…

YOLOv8+PyQt5非洲动物检测(可以重新训练,yolov8模型,从图像、视频和摄像头三种路径识别检测)

效果视频:非洲动物检测yolo检测(https://mbd.pub/o/bread/mbd-ZpaYk51q)_哔哩哔哩_bilibili 资源包含可视化的非洲动物检测系统,基于最新的YOLOv8训练的非洲动物检测模型,和基于PyQt5制作的可视化非洲动物检测系统&am…

免费的维吾尔语翻译器:维汉翻译通App,最近新增了什么功能呢?让我们一起来看看!好用的维语翻译工具支持语音评分功能、支持汉语查拼音等等。

“阿拉伯语是知识,波斯语是糖,印度语是盐,而维吾尔语则是艺术。” 这是一句流传在西域的古老谚语,它不仅道出了维吾尔语言的独特魅力,也表达了人们对语言艺术的无限热爱。 而今,我们带着这份热爱&#x…

厉害了!ATFX登上南非主流报刊《The Citizen》头条

时隔三个月后,ATFX再次登上国际知名报刊头版头条,并迅速成为各大媒体关注焦点。继1月强势登陆《日本时报》经济与商业版面,2月在中东知名媒体CNBC Arabia留下深刻印记后,5月ATFX受邀参展2024年南非峰会并接受媒体采访见证了品牌的…

【成品设计】基于物联网的停车管理系统设计与实现

《基于物联网的停车管理系统设计与实现》 整体功能: 本次课题中,主要设计的是一款基于物联网技术的校园停车的管理系统,该系统能更方便得让管理员对停车场进行管理,同时也能够满足和方便用户使用。针对此种现象,就需…

MotionEditor_ 通过内容感知扩散编辑视频运动

图1. MotionEditor:一种基于扩散的视频编辑方法,旨在将参考视频的运动转移到源视频中。 摘要 现有的基于扩散的视频编辑模型在随时间编辑源视频的属性方面取得了显著进展,但在修改运动信息的同时保持原始主角的外观和背景方面存在困难。为…

一个简单的方式看看MySQL的锁

突然发现半个月没写了。最近事情太多了。 在日常工作的处理问题的过程中,我发现了一个简单的论证锁的问题,以前我讲的有点复杂,看来应该去改改之前的讲法了。 首先构造一个无主键无索引的表。并且初始化5条数据。 场景A: RR隔离…

MyBatis框架——快速入门

MyBatis 是一款优秀的持久层框架,用于简化JDBC开发 MyBatis 本是Apache 的一个开源项目iBatis,2010年这个项目由apache softwarefoundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github 官网: https://mybatis.org/mybatis-3/zh/…