You need to enable JavaScript to run this app.
导航
分析服务概述
最近更新时间:2024.07.17 10:26:44首次发布时间:2024.02.26 16:50:34

云搜索服务支持创建分析服务,提供大规模企业级实时分析的 SQL 能力,实现通过外表方式访问索引数据。在原有的云搜索服务的使用语法基础上,提供了扩展的 SQL 语法能力,基本与标准的 SQL 语法兼容,为企业基于云搜索服务实现 SQL 数据分析提供了强有力的工具支撑。
本文介绍 SQL 分析节点的使用场景。

日志分析

创建分析服务后,支持标准 SQL、兼容 MySQL 协议和语法。云搜索服务能够使用 SQL 进行日志分析,并具备以下优势:

  • 简单易用:使用者大多熟悉常用的 SQL 语法,无需学习新的技术栈即可快速使用。
  • 生态丰富:MySQL 生态是数据库领域使用最广泛的语言,云搜索服务可以与 MySQL 生态和应用无缝衔接,支持使用 MySQL 命令行与各种 GUI、BI 工具等大数据生态结合,实现更复杂多样化的数据处理分析需求。
  • 分析能力强:SQL 语言已经成为数据库和大数据分析的事实标准,它具有强大的表达能力和功能,支持聚合、多表 JOIN、子查询等多种数据分析能力。

在日志分析场景中,常见的几种查询如下:

场景

SQL 语句

查看最新的 10 条数据

SELECT * FROM log_table ORDER BY ts DESC LIMIT 10;

查询 source 为 '192.168.1.1'的、在指定时间段内的最新 10 条数据

SELECT * FROM log_table WHERE source = '192.168.1.1' and ts > '2023-01-14 08:00:00' and ts <= "2023-01-15 08:00:00" ORDER BY ts DESC LIMIT 10;

查询 msg 字段中有 error 或者 404 的最新 10 条数据

SELECT * FROM log_table WHERE msg LIKE '%error%' or msg LIKE '%404%' ORDER BY ts DESC LIMIT 10;

查询 msg 字段中有 image 和 faq 的最新 10 条数据

SELECT * FROM log_table WHERE msg LIKE '%image%' and msg LIKE '%faq%' ORDER BY ts DESC LIMIT 10;

聚合分析

统计分析实际上是根据事实表中的数据,统计任意组合的维度指标,包括过滤、分组和聚合。聚合不仅包括常见的 SUM、COUNT、AVG、MAX、MIN 等,还有 COUNT(DISTINCT)、Pipeline 聚合等。
统计分析的过程是根据模板配置和页面操作条件生成 ES 语法,执行语法,然后返回结果数据。这个过程表面看着不难,但人工编写则很难保证 ES 语法准确无误,您可以借助 SQL 服务准确地生成对应的 ES 语句。
SQL 语句查询示例可参考ElasticSearch 聚合分析

跨索引查询

索引是独立文档的集合体,是否匹配搜索请求取决于文档是否包含所有的所需信息和关联程度。 Elasticsearch 中单个文档的数据变更满足 ACID(原子性、一致性、隔离性、持久性), 而涉及多个文档时则不支持事务。当一个事务部分失败时,无法回滚索引数据到前一个状态。
ElasticSearch 的扁平化设计使得 ES 的索引过程和搜索过程都是快速无锁的,但很难实现关联查询。目前 ElasticSearch 开源文档给出了四种解决方案,详情请参见Managing Relations Inside Elasticsearch。SQL 服务可以认为就是开源文档中 Denormalization 思路的实践,您可以使用 SQL 服务灵活的进行跨索引查询。
示例
存在如下两个索引。第一个索引(person)带有“name”和“career”两个属性;第二个索引(home)带有“person”和“location”两个属性。

{
  "mappings":{
    "person":{
      "name":{
        "type":"string"
      },
      "career": {
        "type":"string"
      }
    }
  }
}
{
  "mappings":{
    "home":{
      "person":{
        "type":"string"
      },
      "location": {
        "type":"string"
      }
    }
  }
}

如果需要查询所有教师(career='teacher')的家乡所在地时,可执行以下查询语句:

SELECT person,location
FROM home JOIN person ON person=name
WHERE career='teacher';