Splunk 子搜索

17 Mar 2025 | 5 分钟阅读

在本节中,我们将学习 Splunk 平台中的 子搜索子搜索Splunk 搜索中非常重要的组成部分,用于在我们的数据池有效地搜索数据。我们将通过不同的示例学习如何使用子搜索,以及如何改进我们的子搜索,以及如何轻松地进行子搜索

使用子搜索

子搜索是用于缩小我们正在查找的事件范围的搜索。 子搜索结果将用作主搜索或外部搜索的参数。 在主搜索中,子搜索用方括号括起来并首先进行评估。

让我们找到在线商店 Buttercup Games 上最常见的购物者,以及该购物者购买的商品。

以下示例说明了执行子搜索的有用之处。 示例 1 说明了如何在不进行子搜索的情况下找到最频繁的购物者。 示例 2 显示了子搜索如何找到最频繁的购物者。

示例 1:不使用子搜索的搜索

我们想找到最频繁的购物者以及该购物者在在线商店 Buttercup Games 上购买的商品。我们将使用 top 命令来返回最持久的购物者。

  1. 开始新的搜索。
  2. 将时间范围更改为 所有时间
  3. 我们使用此搜索来查找访问在线商店次数最多的购物者。

sourcetype=access_* status=200 action=purchase | top limit=1 clientip

在此,limit=1 参数指定返回 1 个值。 clientip 参数指定要返回的字段。

Splunk Sub Searching

Splunk 中,此搜索返回一个 clienttip 值 87.194.216.51 以识别 VIP 购物者。 该搜索还返回一个百分比和一个计数。 这些是 top 命令返回的默认字段。

  1. 然后,我们必须执行另一项搜索,以确定 VIP 购物者订购了多少不同的商品。 使用 stats 命令来计算此 VIP 客户的购买次数。

sourcetype=access_* status=200 action=purchase clientip=87.194.216.51 | stats count, distinct_count(productId), values(productId) by clientip

此搜索将多个统计函数与命令 Stats 一起使用。 函数 separct count() 的别名是 dc()

此搜索使用 count () 函数为 VIP 购物者提供总购买量。 dc () 函数是函数 separct count。 使用此功能来计算购物者购买的不同或独特产品的数量。 values 函数用作多值字段以显示不同的产品 ID。

这种方法的缺点是,每次要构建此表时,我们都将运行两次搜索。 在每个时间范围内,顶级购买者不太可能是同一个人。

示例 2:在 Splunk 中使用子搜索进行搜索

我们将开始我们的第一个要求,以识别在线商店 Buttercup Games 上最频繁的单个购物者。

  1. 现在,将下面的搜索复制并粘贴到搜索栏中,然后运行搜索。 确保时间范围为所有时间

sourcetype=access_* status=200 action=purchase | top limit=1 clientip | table clientip

在此,此搜索返回最频繁的购物者的 clientip,clientip=87.194.216.51。 此搜索与示例 1 的步骤 1 中的搜索几乎相同。 区别在于最后一个管道指令,table clientip,它在一行中显示有关 clientip 的详细信息。 因为使用 table 命令,我们仅指定了 clientip 字段,所以这是唯一返回的字段。

从输出中,将丢弃 top 命令生成的计数和百分比字段。

我们在相同的数据上运行搜索,以查看购物者订购了什么。 我们提供最常见的购物者搜索结果作为购买的搜索条件之一。
最频繁的购物者搜索成为购买搜索的 子搜索。 购买搜索称为 外部 或主搜索。 因为我们正在搜索相同的数据,所以外部搜索的开头与子搜索的开头相同。

在 Splunk 中,子搜索用方括号 [] 括起来,并在读取搜索条件时首先进行评估。

  1. 现在,将下面的搜索复制并粘贴到搜索栏中,然后在编辑器中运行该搜索。

sourcetype=access_* status=200 action=purchase [search sourcetype=access_* status=200 action=purchase | top limit=1 clientip | table clientip] | stats count, distinct_count(productId), values(productId) by clientip

在此代码中,由于 top 命令返回 countpercent 字段,因此 table 命令仅保留 clientip 值。

如果我们在相同的时间范围内运行它,这些结果将与示例 1 中两个搜索的结果匹配。 如果我们调整时间段,我们可能会看到不同的结果,因为对于顶级购买客户而言,这将是不同的。

注意:此子搜索性能取决于多少个不同的 IP 地址与 status=200 AND action = purchase 匹配。 top 命令将必须跟踪所有这些地址,然后才能返回前 1 个,如果存在数千个单独的 IP 地址,则会产生影响。 默认情况下,子搜索最多可以返回 10,000 个结果,并且最长运行时间为 60 秒。 在大型制造环境中,此示例中的子搜索可能会在完成之前超时。 最好的选择是重写查询,以限制子搜索必须处理的事件数量。 或者,可以增加最大结果数和最大运行时间参数。

使搜索语法更易于阅读。

阅读子搜索和冗长的复杂搜索可能具有挑战性。 为了使搜索栏中的搜索语法更易于阅读,我们应将自动格式化添加到搜索语法中。 要将自动格式化应用于搜索,请使用以下键盘快捷键。

  • 我们可以在 Linux 或 Windows 上使用 Ctrl + \。
  • 我们可以在 Mac OSX 上使用 Command + \。
  • 也可以使用 Control + Shift + F,这非常适合许多非英语键盘。
Splunk Sub Searching
下一个主题Splunk 搜索宏