使用ES做数据分析的笔记

前言

项目需要基于交易订单对数据进行分析展示,比如5分钟交易均价展示,比如今日交易量,等等不同维度的数据。一开始想的方案是使用大数据中常用到的 实时计算技术,后来通过一些渠道了解到,如果订单量不大的话可以使用 ElasticSearch 去做一个数据分析,由于之前也没怎么用过ES,只是知道是一个搜索引擎,也不知道能用来做数据分析,所以此篇笔记就是为了记录怎么通过ElasticSearch来做数据分析的调研过程。

目前的思路是先启动好ES,然后造一些订单数据给存进去,然后看能不能实现一些数据的查询。

一些了解ES的文章:

Elasticsearch 最佳运维实践 - 总结(二) - 散尽浮华 - 博客园 (cnblogs.com)

一、ElasticSearch 是什么?

ElasticSearch 的核心是 Apache Lucene,它是一个高性能开源的全文检索库。与 Lucene类似,ElasticSearch 也是一种文档型数据库,但是其设计思路更倾向于搜索和分析。ElasticSearch 的架构是面向文档的,它将所有数据存储为 JSON 文档,每个文档都有唯一的 ID,而且处理结构化和非结构化数据非常容易。它使用诸如分片、副本、修订等技术来确保存储方案具备可靠性、高可用性和可伸缩性。Elasticsearch 采用基于 RESTful API(HTTP)的接口,提供非常完善的查询语句;同时还支持实时字段计算、聚合分析、搜索建议、中文分词以及 Geo 查询等复杂操作。

应用场景

  1. 企业信息检索与分析

ElasticSearch 在企业内部信息检索场景下使用,可以有效降低繁琐的信息查询成本。在数据分析方面,企业可以借助 ElasticSearch 处理各种详细的监控日志、事件存档以及其它事务型数据,并将其与其他系统无缝集成,扩展其可视化和分析能力,从而为运营、安全等业务方提供更多价值。

  1. 日志管理

当遇到大量生成的日志时,传统的关系型数据库已经不能胜任这么高的并发读写需求,在这个场景下,ElasticSearch 展现出来的分布式、分片、复制、自动扩容等特性让它成为了一个独特的解决方案。Elasticsearch 的聚合分析功能非常强大,可以对海量日志进行筛选、统计、数组处理等。

  1. Geo 查询

Geo 查询是指通过地理位置信息查询周边信息的功能,Elasticsearch 内置支持 Geospatial Querying,不仅提供查找某个特定地区的方法,还具有计算地区内部文档数量、距离排序等操作。因此,这个功能的应用场景主要是一些基于地理位置的服务,如酒店、旅游、交通等。

  1. 搜索建议

搜索建议是指输入关键词时,Elasticsearch 会启用自己内置的 Analyzing Shingle Filter 对用户的输入进行分析,然后根据内置的搜索算法返回查询建议。很多电商自带的搜索框下拉框中的补全、自动纠错功能就是这种技术。

  1. 全文检索

当我们需要对关键词全面有效、快速、方便地进行检索时,Elasticsearch 是一个非常不错的选择。与其他数据库不同的是,ElasticSearch 可以支持无论是结构化的数据或非结构化的数据的全文搜索,并可以在集群上和不同类型(文本、数值等)的文档上执行复杂查询操作。

总结

ElasticSeach 提供了高效稳定地实现全文搜索及数据分析服务。其优秀的可扩展性和高可用性使它成为大型网站和企业级系统数据处理的首选解决方案。通过上述应用场景的介绍,我们可以看到 ElasticSearch 在日志管理、企业信息检索与分析、Geo 查询、搜索建议以及全文检索方面有着广泛的应用。同时,ElasticSearch 的开源社区也非常活跃,对其不断升级/完善并提供各种文档及支持等资源。

二、安装ElasticSearch

三、

模拟订单结构如下

类型 是否参与搜索
orderId 订单ID text
price 交易金额 long
payTime 支付时间 date
overTime 完成时间 date
status 状态 integer
类型 1、首发 2 流转 short
issueId 产品ID long
qrCodeNum 资产编号 text
buyUsn 购买用户 keyword
sellUsn 售卖用户 keyword

建表语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
PUT /order_test
{
"mappings": {
"properties": {
"orderId":{
"type": "text",
"index": "true"
},
"qrCodeNum":{
"type": "text",
"index": "true"
},
"price":{
"type": "long",
"index": "true"
},
"tradePrice":{
"type": "float",
"index": "true"
},
"payTime":{
"type": "date",
"index": "true",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"type":{
"type": "integer",
"index": "true"
},
"issueId":{
"type": "long",
"index": "true"
},
"status":{
"type": "integer",
"index": "true"
}
}
}
}

新增数据

1
2
3
4
5
6
7
8
9
10
11
POST /order_test/_doc/1
{
"orderId" : "1",
"price" : 10000,
"qrCodeNum" : "069-2023-A10-01-001",
"tradePrice" : 100.00,
"payTime" : "2023-12-01 13:17:00",
"type" : 1,
"issueId" : 17,
"status" : 1
}