Logstash:运用 Elasticsearch filter 来丰富地理数据

news2024/11/19 8:27:09

我们知道丰富数据对于很多的应用来说非常重要。这涉及到访问不同的表格,并进行搜索匹配。找到最为相近的结果并进行丰富数据。针对 Elasticsearh 来说,我们可以通过 enrich processor来进行丰富。你可以阅读我之前的文章来了解更多:

  • Elasticsearch:enrich processor (7.5发行版新功能)

  • Elasticsearch:如何使用 Elasticsearch ingest 节点来丰富日志和指标

  • Elasticsearch 的新 range 丰富策略使上下文数据分析更上一层楼 - 7.16

事实上,我们甚至可以在 Logstash 的 pipeline 中采用 Elasticsearch filter 来丰富数据。你可以参考我之前的文章 “Logstash:运用 Elasticsearch 过滤器来丰富数据”。

在今天的文章中,我来采用一个简单的例子来展示如何使用 Elasticsearch filter 来丰富地理数据。这个在实际的使用中非常有用。比如你采集的数据含有传感器 id,但是在采集的数据里可能并不包含地理位置信息。我们可以通过 Elasticsearch filter 来丰富数据的地理位置信息,这样可以在地图上进行展示。

 

安装

如果你还没有安装好自己的 Elasticsearch 及 Kibana,请参考文章:

  • 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch
  • Kibana:如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana

在安装的时候,请参考 Elastic Stack 8.x 的安装指南进行安装。

在 Elasticsearch 中创建 enrich 索引

我们在 Elasticsearch 中创建一个可以在 Logstash 中被引用的索引。它的 mapping 是这样的:

PUT myindex
{
  "mappings": {
    "properties": {
      "address": {
        "properties": {
          "city": {
            "type": "text"
          },
          "number": {
            "type": "keyword"
          },
          "street_name": {
            "type": "text"
          },
          "zipcode": {
            "type": "keyword"
          }
        }
      },
      "location": {
        "type": "geo_point"
      }
    }
  }
}

我们接下来写入如下的一个文档:

POST myindex/_doc/1
{
  "address": {
    "zipcode": "17000",
    "number": "23",
    "city": "Beijing",
    "street_name": "wang jing road"
  },
  "location": {
    "lon": 116.478598,
    "lat": 39.995007
  }
}

从上面的数据中,我们可以看到除了含有 address 信息之前,它还含有一个地理位置的信息 location。在实际的使用中,那个 address 甚至可以是传感器的 id 信息。

如果我们知道 address 信息,那么我们可以通过如下的查询来获得该位置的地理信息:

GET myindex/_search?search_type=dfs_query_then_fetch&filter_path=**.hits
{
  "size": 1,
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "address.number": "23"
          }
        },
        {
          "match": {
            "address.street_name": "wang jing road"
          }
        },
        {
          "match": {
            "address.city": "Beijing"
          }
        }
      ]
    }
  }
}

上面的搜索返回如下的信息:

{
  "hits": {
    "hits": [
      {
        "_index": "myindex",
        "_id": "1",
        "_score": 1.4384104,
        "_source": {
          "address": {
            "zipcode": "17000",
            "number": "23",
            "city": "Beijing",
            "street_name": "wang jing road"
          },
          "location": {
            "lon": 116.478598,
            "lat": 39.995007
          }
        }
      }
    ]
  }
}

很显然,它含有 location 的地理位置信息。

在 Logstash 中使用 Elasticsearch filter 来丰富数据

接下来,我们创建如下的一个 Logstash 配置文件:

logstash.conf

input {
  http { }
}

filter {
  elasticsearch {
    query_template => "search-by-name.json"
    index => "myindex"
    fields => {
      "location" => "[location]"
      "address" => "[address]"
    }
    remove_field => ["headers", "host", "@version", "@timestamp"]
    ca_file => "/Users/liuxg/elastic/elasticsearch-8.5.2/config/certs/http_ca.crt"
    ssl => true
    api_key => "Rf-_4IQB-Ec0fhu3PjhI:JlZ0cA8lRQGRDxhWwdDJVg"
  }
}

output {
  stdout { codec => rubydebug }
}

如上所示,我们使用 http input 来做测试。在上面,我们使用 elasticsearch filter 来丰富数据。我们希望得到的是 location 及 address。在上面,我们定义 search-by-name.json 如下:

search-by-name.json

{
  "size": 1,
  "query":{
    "bool": {
      "should": [
        {
          "match": {
            "address.number": "%{[address][number]}"
          }
        },
        {
          "match": {
            "address.street_name": "%{[address][street_name]}"
          }
        },
        {
          "match": {
            "address.city": "%{[address][city]}"
          }
        }
      ]
    }
  }
}

在上面,我们设置 size 为 1,也即采用最为匹配的那个结果。上面其实就是一个搜索。我们把上述文件置于 Logstash 的安装目录下。另外,我们需要定义证书及 API key。你需要根据自己的配置来对上面的配置进行修改。如果你还不值得如何得到 API key,请阅读我之前的文章 “Logstash:如何连接到带有 HTTPS 访问的集群”。当然如果你的 Elasticsearch 不具有安全配置,那么你就不需要进行任何的配置了。

我们使用如下的命令来进行运行:

 ./bin/logstash -f logstash.conf 

我们接下来在另外一个 terminal 中打入如下的命令:

curl -XPOST "localhost:8080" -H "Content-Type: application/json" -d '{
  "test_case": "Address with text",
  "name": "Joe Smith",
  "address": {
    "number": "23",
    "street_name": "wang jing road",
    "city": "Beijing",
    "country": "China"
  }
}'

请注意在上面的命令中,它并没有 location 的任何信息。等执行完后,我们可以在 Logstash 的 terminal 中看到如下的输出:

 

如上所示,我们可以看到被丰富的 location 信息。这个信息来源于 Elasticsearch 中的 myindex 索引。

现在你只需要改变输入部分来读取你的数据源,例如从数据库:

jdbc {
  jdbc_driver_library => "mysql-connector-java-6.0.6.jar"
  jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
  jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/person?useSSL=false"
  jdbc_user => "root"
  jdbc_password => ""
  schedule => "* * * * *"
  parameters => { "country" => "France" }
  statement => "SELECT p.id, p.name, p.dateOfBirth, p.gender, p.children, a.city, a.country, a.countrycode, a.lat, a.lon, a.zipcode FROM Person p, Address a WHERE a.id = p.address_id AND a.country = :country AND p.id > :sql_last_value"
   use_column_value => true
   tracking_column => "id"
}

关于这个部分的详细操作请参考文章 “Elasticsearch:将关系数据库中的数据提取到 Elasticsearch 集群中”。

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

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

相关文章

git commit -m 撤销操作

1. 撤销本次commit-m操作 返回到add成功状态 git reset --soft HEAD^ 2.撤销本次commitadd 返回本地未提交状态 git reset --hard HEAD^ HEAD^ 表示上一个版本,即上一次的commit,几个^代表几次提交,如果回滚两次就是HEAD^^。 也可以写成HEAD…

代码随想录算法训练营第五十五天| LeetCode392. 判断子序列、LeetCode115. 不同的子序列

一、LeetCode392. 判断子序列 1:题目描述(392. 判断子序列) 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新…

SSAT Essay 类写作 - 五步法

从去年起, SSAT 写作转向重点考察critical thinking的考察,SSAT middle 由2篇Story 题目转为一篇Story和一篇Essay, SSAT upper 由 1篇Story 和1 篇Essay 转为 2 篇Essay。这就意味着写好Essay 是SSAT 写作的必备能力。 Essay 写作的要求 体现Critica…

uniapp 实现在线签合同/签名/信息认证(无插件依赖)

最近项目接到一个新的需求,需要对接一个可以在线签合同的的功能,知道需要后马上开干,经过一番斗争,终于终于下班啦 开个玩笑,废话不多说,直接上代码,因为代码是直接项目中搬出来的,没…

把苦难的时光删去:从小县城售货员到深圳IT白领的蜕变之路

希望就像石头缝里的花,有种子就会发芽。 初中辍学,家具店打工,原生家庭带给我太多伤 几乎是所有重男轻女家庭共有的悲剧,我的学习生涯在中考之后寥寥收了场,中考失利,母亲本着“女子无才便是德”的观念不同…

CSS基础

文章目录学习CSS的目的引入的三种方式内部样式表行内样式表外部样式表选择器的分类基础选择器标签选择器类选择器id选择器通配符选择器复合选择器后代选择器子选择器并集选择器伪类选择器盒子模型不同浏览器下盒子模型的区别边框内边距外边距去除浏览器默认样式元素的显示模式块…

Bug系列路径规划算法原理介绍(二)——BUG1 BUG2算法

本系列文章主要对Bug类路径规划算法的原理进行介绍,在本系列的第一篇文章中按照时间顺序梳理了自1986年至2018年Bug类路径规划算法的发展,整理了13种BUG系列中的典型算法,从本系列的第二篇文章开始依次详细介绍了其中具有代表性的BUG1、BUG2、…

面试官:高并发场景下,你们是怎么保证数据的一致性的?图文详解

面试的时候,总会遇到这么一个场景。 1. 场景分析 面试官:你们的服务的QPS是多少? 我:我们的服务高峰期访问量还挺大的,大约是3万吧。 面试官:这么大的访问量,你们的服务器能撑住吗&#xff…

自学unity,该不该阻止?

看清现状,展望未来 进入游戏公司前 进入游戏行业一大契机:在校生身份。各大厂同一个岗位对校招和社会招聘的要求不是一个维度。从学校校招生的身份毕业成为社会人,按照再给两年来算,两年后技术会如何革新?各大公司的招…

【苹果推群发iMessage推】软件安装个性化必要高度 - (void) updateListH

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

MySQL8.0.26—Linux版安装详细教程

❤ 作者主页:Java技术一点通的博客 ❀ 个人介绍:大家好,我是Java技术一点通!( ̄▽ ̄)~* 🍊 记得关注、点赞、收藏、评论⭐️⭐️⭐️ 📣 认真学习,共同进步!&am…

Network error: Connection refused

Network error: Connection refused1 问题的现象2 确认vmware ubuntu侧ssh是否启动2.1 确认ubuntu侧ssh的状态2.2 重启ssh服务2.3 安装ssh1 问题的现象 在用mobaXterm ssh去链接vmware虚拟机ubuntu时一直报下面的错误。 出现该问题之后我做了下面的检测: 检查vmw…

腾讯云年终选购云服务器攻略!

随着云计算的快速发展,很多用户都选择上云,上运中最常见的产品就是云服务器CVM和轻量应用服务器了,那么怎么选购最优惠呢,这篇文章将介绍新老用户选购腾讯云服务器的几个优惠方法。 一、买赠专区 第一个介绍的就是买赠专区&…

在kubernetes中对pod使用tcpdump+wireShark进行抓包

1.查看pod信息,获得pod所在的宿主机 kubectl get pod -n demo -o wide 2.获取宿主机的详情 kubectl get node zeebe.node1 -o wide 3.ssh连接到宿主机 ssh 用户名10.10.11.202 4.查看容器ID,使用POD名称中的关键字进行查找 docker ps|grep nodeapp 5…

java计算机毕业设计ssm图书馆预约管理系统txke6(附源码、数据库)

java计算机毕业设计ssm图书馆预约管理系统txke6(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xf…

【Shell 脚本速成】07、Shell 流程控制——if 判断语句

目录 一、if 介绍 二、单 if 语法 三、if…else 语句 四、if…elif…else 五、if 嵌套 if 5.1 使用 if 嵌套 if 的方式判断两个整数的关系 5.2 写一个nginx安装初始化脚本 六、if 语句与 shell 运算 6.1 与文件存在与否的判断 6.2 文件权限相关的判断 6.3 整数之间…

【数据结构】建堆的方式、堆排序以及TopK问题

建堆的方式、堆排序以及TopK问题1、建堆的两种方式1.1 向上调整建堆1.2 向下调整建堆2、堆排序3、TopK问题4、建堆、堆排序、TopK问题全部代码1、建堆的两种方式 我们知道,堆是二叉树的一种,二叉树的建立是借助结构体与数组完成的(通过在结构…

扫描电镜下的人体感官结构,超震撼

我们对自己的感官最熟悉不过了,但是如果把这些器官放大一千倍一万倍,你还能分辨出来吗?能做到这一点的不是普通的光学显微镜,而是电子显微镜。 电子显微镜可以将物体放大近300000倍,其分辨率可达1纳米(10-9…

Minio学习

目录 一、概述 1、Minio介绍 2、Minio的基础概念 3、Minio安装 3.1、Docker容器中安装 3.2、Windows运行安装 4、分布式Minio优势 数据保护 高可用 一致性 5、Minio客户端使用 6、SpringBoot工程引入Minio 一、概述 Minio分布式文件系统。 Minio是一个基于Apache…

客服回复差评的话术模板

当店铺出现差评时,客服首先要去与客户进行沟通,帮助客户解决问题,尽可能去消除差评;如果客户不愿意沟通,无法消除差评的情况下,客服也要及时对差评进行回复。 前言 对于开网店的店主来说,客户…