Elasticsearch:使用 Node.js 将实时数据提取到 Elasticsearch 中(二)

news2024/9/21 2:34:10

在我的上一篇文章 “Elasticsearch:使用 Node.js 将实时数据提取到 Elasticsearch 中(一)”,我详细描述了如何如何使用 Node.js 来采集地震数据。在今天的文章中,我们来详细描述如何对数据可视化。我们还将创建一个 web 应用来对我们的地震数据进行搜索。

在进行可视化之前,我们可以让我们的应用运用一段时间以收集一定的数据。

创建可视化

在进行可视化之前,我们需要为数据创建一个 data view。我们按照如下的步骤来进行:

 

我们可以在 Discover 中进行查看:

我们可以查看地震数据的详细数据。

我们首先为这个数据制作一个表格:

         

按照同样的方法我们添加其它的字段:

 

我们把当前的视图保存下来:

我们接下来创建一个 Dashboard:

这样我们得到了第一个可视化图。我们可以看到 table 中的 url 字段是不可以点击的。如果我们需要针对它进行点击,我们需要设置它为 keyword 字段,并在 data view 中对它进行配置。

我们接下来创建一个按照时间循序发生地震的时序图:

我们接下来找到最大的 Magnitude 的值:

 按照同样的方法,我们找到最小的 Mangnitude 值:

 我们接下来描绘 Max mangnitude 随着时间变化的曲线。我们添加一个 Lens 的可视化:

按照同样的方法,我们添加一个 Min mag 的曲线图:

最后,我们使用 Maps 来显示地震所在的位置:

从上面我们可以清楚地看到地震发生的位置。点击上面的 Save & return:

这样我们就得到了地震的分布图。

我们点击右上角的 Save 按钮就可以保存这个 dashboard 了。

好了,我们的可视化就做到这里。

创建 web 应用来查询地震 

接下来我们来创建一个 web 应用来对地震的数据进行查询。我们接着之前在文章 “Elasticsearch:使用 Node.js 将实时数据提取到 Elasticsearch 中(一)” 中的代码。我们将创建一个 React 的客户端来使得终端用户来查询 Elasticsearch。最终的界面如下:

我们的客户端允许用户根据地震类型、震级、位置和日期范围搜索地震。 它还允许用户按数量级的升序或降序对搜索结果进行排序。

 当用户点击搜索按钮时,用户输入通过 HTTP 请求发送到服务器。服务器将用户输入传递到 Elasticsearch 请求中,并将请求发送到 Elasticsearch。

Elasticsearch 检索相关文档并将文档发送到服务器。 服务器将文档发送给客户端。

客户端收到文件后,以卡片的形式显示结果。 每张卡片包含一次地震的信息。

创建客户端

我们在另外一个 terminal 中,在 earthquake_app 的目录中,执行如下的命令:

npx create-react-app client

 运行完上面的命令后,我们会发现有一个新的目录 client 被生成:

$ ls
client            node_modules      package.json
config            package-lock.json server

 我们接下来安装 Axios。我们进入 client 目录中:

$ cd client/
$ ls
node_modules package.json yarn.lock

我们将使用一个名为 axios 的库向我们的服务器发送 HTTP 请求。通过执行以下命令安装 axios。

npm i axios
$ npm i axios
npm notice Beginning October 4, 2021, all connections to the npm registry - including for package installation - must use TLS 1.2 or higher. You are currently using plaintext http to connect. Please visit the GitHub blog for more information: https://github.blog/2021-08-23-npm-registry-deprecating-tls-1-0-tls-1-1/
npm notice Beginning October 4, 2021, all connections to the npm registry - including for package installation - must use TLS 1.2 or higher. You are currently using plaintext http to connect. Please visit the GitHub blog for more information: https://github.blog/2021-08-23-npm-registry-deprecating-tls-1-0-tls-1-1/

added 5 packages, removed 1 package, and changed 9 packages in 6s

209 packages are looking for funding
  run `npm fund` for details

运行完上面的命令后,我们可以查当前目录下 package.json 的内容:

$ pwd
/Users/liuxg/demos/earthquake_app/client
$ cat package.json 
{
  "name": "client",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "axios": "^1.2.2",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "react-scripts": "5.0.1"
  }
}

我们可以看到 react 及 axios 已经被成功地添加到 dependencies 里去了。

在 package.json 文件中,我们将添加 "proxy" 键并将代理指向运行 Node.js 服务器的 localhost:5001。这样我们的 package.json 的内容如下:

{
  "name": "client",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "5.16.5",
    "@testing-library/react": "13.3.0",
    "@testing-library/user-event": "13.5.0",
    "axios": "^1.2.2",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "react-scripts": "5.0.1",
    "web-vitals": "^3.1.0"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "proxy": "http://localhost:5001",
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}

我们可以按照如下的方法来统一安装所需要的 Node.js 库:

$ pwd 
/Users/liuxg/demos/earthquake_app/client
$ npm install
npm notice Beginning October 4, 2021, all connections to the npm registry - including for package installation - must use TLS 1.2 or higher. You are currently using plaintext http to connect. Please visit the GitHub blog for more information: https://github.blog/2021-08-23-npm-registry-deprecating-tls-1-0-tls-1-1/
npm notice Beginning October 4, 2021, all connections to the npm registry - including for package installation - must use TLS 1.2 or higher. You are currently using plaintext http to connect. Please visit the GitHub blog for more information: https://github.blog/2021-08-23-npm-registry-deprecating-tls-1-0-tls-1-1/

up to date in 1s

222 packages are looking for funding
  run `npm fund` for details

为了方便大家学习,我把最终的代码放到 github 上:GitHub - liu-xiao-guo/earthquake-app-final。

为了能够让我们的 web 应用访问 Elasticsearch,我们针对 server.js 进行修改:

server/server.js

const express = require('express');
const client = require('./elasticsearch/client');
const cors = require('cors');
const { Client } = require('@elastic/elasticsearch');

const app = express();

const port = 5001;

//Define Routes
const data = require('./routes/api/data')
app.use('/api/data', data);

app.get('/', (req, res) => {
    res.send('Hello World!')
  })

app.use(cors());

app.get('/results', (req, res) => {
  const passedType = req.query.type;
  const passedMag = req.query.mag;
  const passedLocation = req.query.location;
  const passedDateRange = req.query.dateRange;
  const passedSortOption = req.query.sortOption;

  console.log("passedType = " + passedType);
  console.log("passedMag = " + passedMag);
  console.log("passedLocation = " + passedLocation);
  console.log("passedDateRange = " + passedDateRange);
  console.log("passedSortOption = " + passedSortOption);

  var request = {
    sort: [
      {
        mag: {
          order: passedSortOption,
        },
      },
    ],
    size: 300,
    query: {
      bool: {
        filter: [
          {
            term: { type: passedType },
          },
          {
            range: {
              mag: {
                gte: passedMag,
              },
            },
          },
          {
            match: { place: passedLocation },
          },
          // for those who use prettier, make sure there is no whitespace.
          {
            range: {
              '@timestamp': {
                gte: `now-${passedDateRange}d`,
                lt: 'now',
              },
            },
          },
        ],
      },
    },
  }

  console.log("request = " + JSON.stringify(request));

  async function sendESRequest() {
    const body = await client.search({
      index: 'earthquakes',
      body: request,
    });

    console.log(body);
    res.json(body.hits.hits);
  }

  console.log("Send ES Request ....")
  sendESRequest();
});  

app.listen(port, () => console.log(`Server listening at http://localhost:${port}`));

如上所示,我们增加了一个接口 /results。它可以通过如下的形式来对它进行访问:

curl -XGET http://localhost:5001/api/data/earthquakes?type=xxx&mag=xxx&location=xxx&dateRange=xxx&sortOption=xxx

上面的 xxx 是可以通过 web 的界面来获得的:

 在上面,它定义了一个搜索的请求。它相当于 Elasticsearch 这样的一个查询:

GET earthquakes/_search
{
  "size": 300,
  "sort": [
    {
      "mag": {
        "order": "desc"
      }
    }
  ],
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "type": "earthquake"
          }
        },
        {
          "range": {
            "mag": {
              "gte": "1.5"
            }
          }
        },
        {
          "match": {
            "place": "Alaska"
          }
        },
        {
          "range": {
            "@timestamp": {
              "gte": "now-7d",
              "lt": "now"
            }
          }
        }
      ]
    }
  }
}

我们把返回的结果通过一个个 card 来进行展示:

我们需要在 client 的目录下使用如下的命令来启动 web 应用:

npm start

我们可以改变上面的搜索参数来搜索 Elasticsearch 数据,比如:

好了,今天的展示就到这里。希望大家也一起学到了知识!

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

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

相关文章

推荐七个Python效率工具!让你事半功倍

为了提高效率,我们在平时工作中常会用到一些Python的效率工具,Python作为比较老的编程语言,它可以实现日常工作的各种自动化。为了更便利的开发项目,这里给大家推荐几个Python的效率工具。 1、Pandas-用于数据分析 Pandas是一个强…

UEditorPlus v2.8.0发布 颜色自定义,文档功能完善

UEditor是由百度开发的所见即所得的开源富文本编辑器,基于MIT开源协议,该富文本编辑器帮助不少网站开发者解决富文本编辑器的难点。 UEditorPlus 是有 ModStart 团队基于 UEditor 二次开发的富文本编辑器,主要做了样式的定制,更符…

vim使用教程图文教程(超详细)

1. 三种模式 vim编辑器有三种模式:命令模式、编辑模式、末行模式。 「命令模式」:可以进行删除、复制、粘贴等快捷操作。「编辑模式」:可以编辑文件内容。「末行模式」:可以通过命令操作文件,比如搜索、保存、退出等…

【C语言】字符串小练习(每日小细节012)

前言: 欢迎打开这篇博客,从今天开始,每天和大家分享一个C语言小细节,不久之后还会追加C 一些常常被忽视的小细节和思想统一的编程题目是这个专栏的核心哦 虽然简单但千万别在细节处失分!!!&…

【Linux编辑神器:vim】

目录 1. vim的基本概念 2. vim的基本操作 3. vim正常模式命令集 4. vim底行模式命令集 5. 简单vim配置 6 总结 什么是Vi/Vim? vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令&#xff0…

【算法】关于双指针的奇技淫巧(一):对撞指针

一、对撞指针 对撞指针由两个指针组成,分别指向数据的头部和尾部: 两个指针分别从两头移动,寻找符合答案的位置后停下。对撞指针主要应用于有序数组的求和,我们使用一个题目进行说明: 示例如下: 根据题目可…

元数据管理Datahub基本介绍和特点

目录1. 基本介绍2. 功能特色2.1 支持不同平台的元数据同步和搜索2.2 血缘关系2.3 查询数据集的统计信息2.4 实时治理2.5 Datahub的权限管理2.6 使用Domains、Glossary Terms、tags对数据Entity进行管理2.7 在Web界面对元数据进行管理1. 基本介绍 Datahub是现代数据栈的元数据管…

TypeScript(一)TypeScript下载安装,编译运行的三种方式:tsc命令行/webpack搭建环境/tsc-node库

什么是TypeScript? TypeScript是拥有类型的JavaScript超集,它可以编译成普通、干净、完整的JavaScript代码。 简单理解:TypeScript就是加强版的JavaScript TypeScript环境搭建 搭建前准备 TypeScript最终会被编译成JavaScript代码,那么我…

JavaSE笔记——函数式编程(类库)

文章目录前言一、基本类型二、重载解析三、FunctionalInterface四、默认方法五、Optional总结前言 前面知道了如何编写 Lambda 表达式,下面将详细阐述另一个重要方面:如何使用 Lambda 表达式。即使不需要编写像 Stream 这样重度使用函数式编程风格的类库…

find_package()的使用

find_package()命令是用来查找依赖包的,理想情况下,一句find_package()把一整个依赖包的头文件包含路径、库路径、库名字、版本号等情况都获取到,后续只管用就好了。但实际中往往CMake失败就是出在find_package()的失败上(这里不考…

朝花夕拾 - 2023 莽一年

Hello 2023,我来了~今年,又是一个怎样的楚门世界,我要如何在里面撒泼,期待~一 回收 2022 不及格答卷 回首 2022,那真的不堪回首,细节太多了,没做好没把握住~但是,不管 2022 过得怎样…

Qt6 中如何使用 qsb

【写在前面】 Qt 5 的图形体系结构非常依赖 OpenGL 作为底层 3D 图形 API。但过去 8 年来随着 Metal 和 Vulkan 的推出,市场发生了巨大变化。现在,Qt 6 加入了大量不同平台的图形 API,以确保用户可以在所有平台上以最高性能运行 Qt。 在 Qt Q…

【类和对象(完结)】

目录 1. 再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表 1.3 explicit关键字 2. static成员 2.1 概念 2.2 特性 3. 友元 3.1 友元函数 3.2 友元类 4. 内部类 5.匿名对象 6.拷贝对象时的一些编译器优化 7. 再次理解类和对象 8.总结 1. 再谈构造函数 1.1 构造函数体…

技术分享| 如何使用Prometheus实现系统进程监控

如何监控线上正在运营的系统?如何得知系统目前是正常还是异常? Prometheus是这么一套数据监控解决方案。它能让运维及开发人员随时掌控系统的运行状态,快速定位出现问题的位置,快速排除故障。只要按照 Prometheus的方式来做&#…

力扣刷题记录——258. 各位相加、263.丑数、268.丢失的数字

本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《258. 各位相加、263.丑数、268.丢失的数字》。 目录 25…

第三十五讲:神州无线局域网基础知识

1. IEEE 802.11协议 802.11无线标准家族包括802.11a/b/g/n/ac五个标准理论上可以提供高达每秒1Gbit的数据传输能力标准定义了如何使用免授权2.4 GHz 和 5GHz 频带的电磁波进行信号传输。 802.11无线标准家族 802.11a 802.11b 802.11g 802.11n 802.11ac 工作频段 5GHz 2…

内存访问为什么要分段?

内存分段是处理器为访问内存而设计的机制,称为内存分段机制。 简单的内存知识 内存结构(连续且地址依次升高) 访问方式 内存是随机读写设备,即访问其内部任何处,不需要从头开始找,只要直接给出其地址便可。…

【项目启动】IDEA新建项目同步到Github

文章目录SSH秘钥检查GitHub创建项目IDEA创建项目IDEA同步GitHubSSH秘钥检查 目前,github不支持https形式的远程同步方式,如果使用https形式进行同步会报以下错误: remote: Support for password authentication was removed on August 13, 2…

C# WinForm CAD文件显示(dxf,dwg显示)

找遍全网很难找到开源dxf显示控件(C# winform),大部分控件都需要收费,对于做软件开发很麻烦 C# WPF倒是有nefdxfZoomableCanvas可以实现,确实很方便,这个在github:https://github.com/shao200/WpfDxfViewer上也能找到开…

c++11 标准模板(STL)(std::deque)(六)

定义于头文件 <deque> std::deque 容量 检查容器是否为空 std::deque<T,Allocator>::empty bool empty() const; (C11 前) bool empty() const noexcept; (C11 起) (C20 前) [[nodiscard]] bool empty() const noexcept; (C20 起)检查容器是否无元素&#xff0c…