<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Tyler Perkins - Elasticsearch Labs]]></title>
    <description><![CDATA[Articles and tutorials from the Search team at Elastic]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Tyler Perkins - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/cn/search-labs/author/tyler-perkins</link>
    </image>
    <link>https://www.elastic.co/cn/search-labs/author/tyler-perkins</link>
    <atom:link href="https://www.elastic.co/cn/search-labs/rss/author/tyler-perkins.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[cn]]></language>
    <lastBuildDate>Fri, 18 Sep 2026 22:38:47 GMT</lastBuildDate>
  <item>
    <title><![CDATA[9.2 中的 ES|QL：Smart Lookup Joins 和时间序列支持]]></title>
    <description><![CDATA[探索 Elasticsearch 9.2 中 ES|QL 的三个独立更新：增强的 LOOKUP JOIN 用于更具表现力的数据关联、新的 TS 命令用于时间序列分析，以及灵活的 INLINE STATS 命令用于聚合。]]></description>
    <content:encoded><![CDATA[<p>10 月发布的 Elasticsearch 9.2 版本包含诸多重大改进，使数据分析比以往任何时候都更快、更灵活、更易访问。该版本的核心是对我们的管道式查询语言 ES|QL 的重要增强，旨在直接为终端用户带来更多价值。</p><p>下面将介绍 Elasticsearch 9.2 中的功能，这些功能将利用 ES|QL 改变您的数据分析工作流。</p><h2>数据关联的革命：更智能、更快速、更灵活的 Lookup Join</h2><p>在 Elasticsearch 9.2 中，ES|QL 中的 <a href="https://www.elastic.co/docs/reference/query-languages/esql/commands/lookup-join">LOOKUP JOIN</a> 命令发生了重大变化，变得更加高效和多功能。LOOKUP JOIN 将 ES|QL 查询结果表中的数据与指定查找模式索引中的匹配记录结合起来。它会根据连接字段中的匹配值，将查找索引中的字段作为新列添加到结果表中。以前，连接数据仅限于单一字段和简单相等。不再是这样了！这些增强功能使您能够轻松应对复杂的数据关联方案。</p><p><strong>Lookup Join 的主要增强功能包括：</strong></p><ul><li><p><strong>多字段连接：</strong>轻松连接多个字段。例如，要将 <code>application_logs</code> 与 <code>service_registry</code> 连接到 <code>service_name</code>，<code>environment</code> 和 <code>version:</code></p></li></ul>FROM application_logs
| LOOKUP JOIN service_registry ON service_name, environment, version<ul><li><p><strong>使用表达式释放复杂的连接谓词（技术预览）：</strong></p></li></ul><p>您不再局限于简单相等。LOOKUP JOIN 现在允许您指定<strong>多个相关性标准</strong>，并纳入一系列<strong>二进制运算符</strong>，包括 ==、 !=、&lt;、&gt;、&lt;= 和 &gt;=。这意味着您可以创建高度细致的连接条件，从而能够对数据提出更复杂的问题。</p><p>示例 1：使用按服务 SLA 阈值查找应用程序指标</p>FROM application_metrics
| LOOKUP JOIN sla_thresholds
      ON service_name == sla_service AND response_time &gt; sla_response_time<p>示例 2：此查询根据随时间变化的地区定价政策计算应付金额。它根据复杂的日期范围和相等条件连接三个数据集，计算出最终的 <code>due_amount</code>。第二个查找连接使用 <code>meter_readings</code> 索引中的<code>measurement_date</code> 字段和<code>customers</code> 索引中的<code>region_id</code> 字段连接到<code>pricing_policies</code> 索引，并为特定 <code>region</code> 和 <code>measurement_date</code> 查找正确的定价策略。</p>FROM meter_readings
| LOOKUP JOIN customers
      ON meter_id
| LOOKUP JOIN pricing_policies
      ON
        region_id == region AND
          measurement_date &gt;= policy_begin_date AND
          measurement_date &lt; policy_end_date
| EVAL due_amount = (kwh_consumed * rate_per_kwh + base_charge) * (1 + tax_rate)
| EVAL period = policy_name
| KEEP customer_name, period, due_amount, measurement_date, kwh_consumed,
    rate_per_kwh, base_charge, tax_rate
| SORT measurement_date<ul><li><p><strong>过滤连接带来的巨大性能提升： </strong></p></li></ul><p>我们提高了使用查找表条件筛选的“扩展连接”的性能。扩展连接会使每条输入行产生多个匹配项，从而产生较大的中间结果集。当后续筛选器丢弃其中许多行时，情况会变得更糟。在 9.2 中，我们通过在对查找数据应用筛选器时筛选掉不必要的行来优化这些连接，而避免处理将被丢弃的行。在某些情况下，这些连接的速度最多可以<strong>快 1000 倍</strong>！</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltce2c948a9a00a348/6a17f1a20b0bed8c08dd368b/002c014ee29b1aaf9ddeb8c554bb76efe3ed180c-1572x954.png" alt="过滤连接性能提升" /><p>这种优化在处理“扩展连接”时至关重要，因为在这种情况下，查找最初可能会产生许多潜在的匹配项。通过智能推送筛选器，仅处理相关数据，从而大幅缩短查询执行时间，实现对海量数据集的实时分析。这意味着，即使是大型或复杂的连接操作，您也能更快地获得见解。</p><p><strong>Lookup Join 跨集群搜索 (CCS) 兼容性：</strong></p><p>当 Lookup Join 在 8.19 和 9.1 版本中正式发布时，它缺少跨集群搜索 (CCS) 支持。对于在多个集群中运行的组织，LOOKUP JOIN 现在可与 9.2 中的 CCS 无缝集成。只需在要执行连接的所有远程集群上放置查找索引，ES|QL 就会自动利用这些远程查找索引来连接远程数据。这简化了分布式数据分析，并确保在整个 Elasticsearch 部署中实现一致的丰富性。</p><p>这些改进意味着您可以以前所未有的精度、速度和便捷性关联各种数据集，从而发现更深入、更具可操作性的见解，而无需复杂的替代方案或预处理步骤。</p><h2>轻松丰富您的数据：适用于 Lookup 索引的 Kibana Discover 用户体验</h2><p>数据丰富应该简单，而不是障碍。我们在 Kibana 的 Discover 中为创建和管理查找索引引入了绝佳的全新用户体验。</p><p><strong>直观的工作流：</strong>Discover 全面的自动完成功能将引导您完成整个流程，并在 ES|QL 编辑器中建议查找索引和连接字段，使您可以非常轻松地将上传的数据与现有索引连接起来。键入一个不存在的查找索引名称，然后直接访问 Lookup 编辑器，只需单击一下即可创建索引。键入现有查找索引的名称，我们将为您提供编辑该索引的选项：</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt20a75bcfd25eb156/6a17f1a46864a4864db688a1/d36fd6ffd6bc0bf8d31067f6266445c68d15c71c-1400x184.png" alt="" /><p><strong>在线管理 (CRUD)：</strong>直接在 Discover 中使用行内编辑功能（创建、读取、更新、删除），使参考数据集保持最新状态。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6263c5dd8c2c9d7e/6a17f1a5af47b614dbcde095/a0e4aa66540b1f725c24ccb0519d978415073bb6-1453x842.png" alt="LOOKUP 查询示例" /><p><strong>轻松上传文件：</strong>现在，您可以在 Discover 中直接上传 CSV 等文件，并立即在 <code>LOOKUP JOIN</code> 中使用这些文件。再也不需要在 Kibana 的不同区域之间来回切换上下文了！</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltddfcc3580af0e5c6/6a17f1a73e9e45965aba1587/0f5dc2c712af4c4cada50292a7c8b836eb02aa67-1600x748.png" alt="将数据轻松添加到查找索引，并在 LOOKUP JOIN 中使用它们" /><p>无论您是将用户 ID 映射到名称、添加业务元数据，还是连接静态参考文件，此功能都能让数据丰富化变得触手可及，将连接的强大功能直接交到每个用户的手中——快速、简单且集中于一处。</p><h2>保留上下文：INLINE STATS 简介（技术预览）</h2><p>数据聚合至关重要，但有时您需要在查看原始数据的<em>同时</em>查看聚合数据。我们很高兴将 <a href="https://www.elastic.co/docs/reference/query-languages/esql/commands/inlinestats-by">INLINE STATS</a> 作为<strong>技术预览</strong>功能推出。</p><p><code>STATS</code> 命令会将输入字段替换为聚合输出，而<code>INLINE STATS</code> 命令则不同，它保留了所有原始输入字段，只是添加了新的聚合字段。这样，您就可以在聚合<em>后</em>对原始输入字段执行进一步操作，从而提供更连续、更灵活的分析工作流。</p><p>例如，要在计算平均飞行距离的同时保留单个飞行记录行：</p>FROM kibana_sample_data_flights
 | KEEP Carrier, Dest, DistanceMiles
 | INLINE STATS avgDist = ROUND(AVG(DistanceMiles))
       BY Dest
 | WHERE DistanceMiles &gt; avgDist<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9e0c7209db8a67ad/6a17f1a9e8fbcee5233a1a53/6eea943035e0ab371270084c504a06bb89f8b82b-1496x290.png" alt="使用 avgDist 筛选飞行距离大于平均值的飞行结果 " /><p>在此查询中，将 <code>avgDist</code> 与我们分组的相应 <code>Dest</code> (ination) 添加到每一行中，然后，由于我们仍有航班信息列，我们可以将结果筛选为飞行距离大于平均值的航班。</p><h2>ES|QL 中的时间序列支持（技术预览版）</h2><p>Elasticsearch 使用<a href="https://www.elastic.co/docs/manage-data/data-store/data-streams/time-series-data-stream-tsds">时序数据流</a>来存储指标。我们将通过 <a href="https://www.elastic.co/docs/reference/query-languages/esql/commands/ts"><code>TS</code></a> 源代码命令在 ES|QL 中添加对时间序列聚合的支持。此功能在 Elastic Cloud serverless 和 9.2 基础版中以技术预览版的形式提供。</p><p>时间序列分析主要基于聚合查询，这些查询按照一个或多个筛选维度对时间分桶的指标值进行汇总。大多数聚合查询依靠两步处理，包括：(a) 内部聚合函数对每个时间序列的值进行汇总，以及 (b) 外部聚合函数将 (a) 的结果在时间序列之间进行组合。</p><p><a href="https://www.elastic.co/docs/reference/query-languages/esql/commands/ts"><code>TS</code></a> 源命令与 <a href="https://www.elastic.co/docs/reference/query-languages/esql/commands/stats-by"><code>STATS</code></a> 结合使用，为表达对时间序列的查询提供了一种简洁而有效的方法。具体来说，请考虑以下计算每个主机和每小时的总请求率的示例：</p>TS my_metrics
| WHERE @timestamp &gt; NOW() - 1 day
| STATS SUM(RATE(requests))
      BY host, TBUCKET(1h)<p>在这种情况下，首先对每个时间序列和每个小时的时间序列聚合函数 <code>RATE</code> 进行评估。生成的部分聚合值随后使用 <code>SUM</code> 进行组合，以计算每个主机和每小时的最终聚合值。</p><p>您可以在<a href="https://www.elastic.co/docs/reference/query-languages/esql/functions-operators/time-series-aggregation-functions">此处</a>查看可用的时间序列聚合函数列表。现在支持<a href="https://www.elastic.co/docs/manage-data/data-store/data-streams/time-series-data-stream-tsds#time-series-metric">计数</a>率，这可以说是处理计数器最重要的聚合功能。</p><p><code>TS</code> 源命令旨在与<code>STATS</code> 结合使用，其执行经过调整，可有效支持时间序列聚合。例如，数据在进入<code>STATS</code> 之前要进行排序。目前不允许在 <code>TS</code> 和 <code>STATS</code> 之间执行可能丰富或改变时序数据或其顺序的处理命令，例如 <a href="https://www.elastic.co/docs/reference/query-languages/esql/commands/fork"><code>FORK</code></a> 或 <a href="https://www.elastic.co/docs/reference/query-languages/esql/commands/inlinestats-by"><code>INLINE STATS</code></a>。将来可能会取消这一限制。</p><p><code>STATS</code> 表格输出可使用任何适用命令进行进一步处理。例如，以下查询计算每台主机和每小时的平均 <code>cpu_usage</code> 与最大值的比率：</p>TS my_metrics
| STATS avg_usage = AVG(AVG_OVER_TIME(cpu_usage))
      BY host, time_bucket = TBUCKET(1h)
| INLINE STATS max_avg_usage = MAX(avg_usage)
      BY host
| EVAL ratio = avg_usage / max_avg_usage
| KEEP host, time_bucket, ratio
| SORT host, time_bucket DESC<p>时序数据存储在我们基于 Lucene 文档值的底层列式存储引擎中。TS 命令通过 ES|QL 计算引擎增加了向量化查询执行功能。与等效的<a href="https://www.elastic.co/docs/reference/query-languages/querydsl">DSL</a>查询相比，查询性能往往提高一个数量级以上，并可与已建立的特定度量系统相媲美。我们将在未来提供详细的架构和性能分析，敬请期待。</p><h2>扩展您的工具包：ES|QL 新功能</h2><p>为了进一步增强 ES|QL 的实用性和多功能性，我们添加了一套新<a href="https://www.elastic.co/docs/reference/query-languages/esql/esql-functions-operators">功能</a>：</p><p><strong>字符串操作：</strong><a href="https://www.elastic.co/docs/reference/query-languages/esql/functions-operators/string-functions#esql-contains">CONTAINS</a>、<a href="https://www.elastic.co/docs/reference/query-languages/esql/functions-operators/mv-functions#esql-mv_contains">MV_CONTAINS</a>、<a href="https://www.elastic.co/docs/reference/query-languages/esql/functions-operators/string-functions#esql-url_encode">URL_ENCODE</a>、<a href="https://www.elastic.co/docs/reference/query-languages/esql/functions-operators/string-functions#esql-url_encode_component">URL_ENCODE_COMPONENT</a>、<a href="https://www.elastic.co/docs/reference/query-languages/esql/functions-operators/string-functions#esql-url_decode">URL_DECODE</a>，用于更强大的文本和 URL 处理。</p><p><strong>时间序列和地理空间：</strong> <a href="https://www.elastic.co/docs/reference/query-languages/esql/functions-operators/grouping-functions#esql-tbucket">TBUCKET</a>用于灵活的时间分桶，TO_DENSE_VECTOR 用于矢量运算，以及一套全面的<a href="https://www.elastic.co/docs/reference/query-languages/esql/functions-operators/spatial-functions">地理空间函数，</a>如<code>ST_GEOHASH</code> 、 <code>ST_GEOTILE</code> 、 <code>ST_GEOHEX</code> 、 <code>TO_GEOHASH</code> 、 <code>TO_GEOTILE</code> 、 <code>TO_GEOHEX</code>用于高级基于位置的分析。</p><p><strong>日期格式：</strong>使用 <a href="https://www.elastic.co/docs/reference/query-languages/esql/functions-operators/date-time-functions#esql-day_name">DAY_NAME</a>、<a href="https://www.elastic.co/docs/reference/query-languages/esql/functions-operators/date-time-functions#esql-month_name">MONTH_NAME</a>，以获得更易读的日期表示形式。</p><p>这些功能为您提供了一套更丰富的工具，可直接在 ES|QL 中操作和分析您的数据。</p><h2>内在优势：更高的性能和效率</h2><p>除了上述突出的功能外，Elasticsearch 9.2 还对 ES|QL 进行了大量性能优化。在函数能够替代多个类似 RLIKE 查询的情况下，我们使用 pushdown 加快了 <a href="https://www.elastic.co/docs/reference/query-languages/esql/commands/where#like-and-rlike">RLIKE(LIST)</a> 的执行速度。通过 <code>RLIKE</code> (LIST)，我们可以将这些查询合并为一个自动机，并应用一个自动机而不是多个自动机。我们还通过索引排序加快了关键字字段的加载速度，并对一般查询进行了优化——这些改进可确保您的 ES|QL 查询比以往更高效地运行。</p><h2>立即开始！</h2><p>Elasticsearch 9.2 标志着 ES|QL 的重大飞跃，为您的数据分析工作流带来了前所未有的强大功能和灵活性。我们鼓励您探索这些新功能，并体验它们带来的不同。</p><p>有关 Elasticsearch 9.2 中所有更改和增强功能的完整列表，请参阅<a href="https://www.elastic.co/guide/en/elasticsearch/reference/9.2/release-notes-9.2.0.html">正式发布说明</a>。祝您查询愉快！</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/esql-elasticsearch-9-2-multi-field-joins-ts-command</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/esql-elasticsearch-9-2-multi-field-joins-ts-command</guid>
    <category><![CDATA[ES|QL]]></category>
    <dc:creator><![CDATA[Tyler Perkins,Kostas Krikellas,Julian Kiryakov]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd30ea8cac3809cc3/6a17f1aa4b055dd8734322f8/415894e21e7758c907d6e60d4efc94230349beef-2012x1164.png" length="0" type="image/png"/>
    <pubDate>Tue, 02 Dec 2025 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>