druid-docs-cn/Querying/filters.md

10 KiB
Raw Blame History

查询过滤器Query Filters

[!WARNING] Apache Druid支持两种查询语言 Druid SQL原生查询。该文档描述了原生查询中的一种查询方式。 对于Druid SQL中使用的该种类型的信息可以参考 SQL文档

Filter是一个JSON对象指示查询的计算中应该包含哪些数据行。它本质上相当于SQL中的WHERE子句。Apache Druid支持以下类型的过滤器。

注意

过滤器通常情况下应用于维度列,但是也可以使用在聚合后的指标上,例如,参见 filtered-aggregatorhaving-filter

选择过滤器(Selector Filter)

最简单的过滤器就是选择过滤器。 选择过滤器使用一个特定的值来匹配一个特定的维度。 选择过滤器可以被用来当做更复杂的布尔表示式过滤器的基础过滤器。

选择过滤器的语法如下:

"filter": { "type": "selector", "dimension": <dimension_string>, "value": <dimension_value_string> }

该表达式等价于 WHERE <dimension_string> = '<dimension_value_string>'

选择过滤器支持使用提取函数,详情可见 带提取函数的过滤器

列比较过滤器(Column Comparison Filter)

列比较过滤器与选择过滤器很相似,不同的是比较的不同的维度。例如:

"filter": { "type": "columnComparison", "dimensions": [<dimension_a>, <dimension_b>] }

该表达式等价于 WHERE <dimension_a> = <dimension_b>

dimensionsDimensionSpecs中的list 需要的话还可以使用提取函数。

正则表达式过滤器(Regular expression Filter)

正则表达式过滤器与选择过滤器相似,不同的是使用正则表达式。 它使用一个给定的模式来匹配特性的维度。 模式可以是任意的标准 Java正则表达式

"filter": { "type": "regex", "dimension": <dimension_string>, "pattern": <pattern_string> }

正则表达式支持使用提取函数,详情可见 带提取函数的过滤器

逻辑表达式过滤器(Logical expression Filter)

AND

AND过滤器的语法如下

"filter": { "type": "and", "fields": [<filter>, <filter>, ...] }

该过滤器的fields字段中可以是本页中的任何一个过滤器

OR

OR过滤器的语法如下

"filter": { "type": "or", "fields": [<filter>, <filter>, ...] }

该过滤器的fields字段中可以是本页中的任何一个过滤器

NOT

NOT过滤器的语法如下

"filter": { "type": "not", "field": <filter> }

该过滤器的field字段中可以是本页中的任何一个过滤器

JavaScript过滤器

JavaScript过滤器使用一个特定的js函数来匹配维度。 该过滤器匹配到函数返回为true的值。

JavaScript函数需要一个维度值的参数返回值要么是true或者false

{
  "type" : "javascript",
  "dimension" : <dimension_string>,
  "function" : "function(value) { <...> }"
}

例如, 下边的表达式将匹配维度 namebarfoo 之间的维度值。

{
  "type" : "javascript",
  "dimension" : "name",
  "function" : "function(x) { return(x >= 'bar' && x <= 'foo') }"
}

JavaScript过滤器支持使用提取函数详情可见 带提取函数的过滤器

[!WARNING] 基于JavaScript的功能默认是禁用的。 如何启用它以及如何使用Druid JavaScript功能参考 JavaScript编程指南

提取过滤器(Extraction Filter)

[!WARNING] 提取过滤器当前已经废弃。 指定了提取函数的选择器过滤器提供了相同的功能,应该改用它。

提取过滤器使用一个特定的 提取函数 来匹配维度。 以下筛选器匹配提取函数具有转换条目input_key=output_value的值,其中output_value等于过滤器valueinput_key作为维度显示。

例如, 下列例子匹配 product 列中维度值为 [product_1, product_3, product_5]的数据:

{
    "filter": {
        "type": "extraction",
        "dimension": "product",
        "value": "bar_1",
        "extractionFn": {
            "type": "lookup",
            "lookup": {
                "type": "map",
                "map": {
                    "product_1": "bar_1",
                    "product_5": "bar_1",
                    "product_3": "bar_1"
                }
            }
        }
    }
}

搜索过滤器(Search Filter)

搜索过滤器可以使用在部分字符串上进行过滤匹配

{
    "filter": {
        "type": "search",
        "dimension": "product",
        "query": {
          "type": "insensitive_contains",
          "value": "foo"
        }
    }
}
属性 描述 是否必须
type 该值始终为search
dimension 要执行搜索的维度
query 搜索类型的详细JSON对象。 详情可看下边
extractionFn 对维度使用的 提取函数

搜索过滤器支持使用提取函数,详情可见 带提取函数的过滤器

搜索查询规格

Contains

属性 描述 是否必须
type 该值始终为contains
value 要执行搜索的字符串值
caseSensitive 两个字符串比较时是否忽略大小写 默认为false

Insensitive Contains

属性 描述 是否必须
type 该值始终为insensitive_contains
value 要执行搜索的字符串值

注意:一个"insensitive_contains"搜索等价于一个具有值为false或者未提供的"caseSensitive"的"contains"搜索

Fragment

属性 描述 是否必须
type 该值始终为fragment
values 要执行搜索的字符串值数组
caseSensitive 两个字符串比较时是否忽略大小写 默认为false

In过滤器

In过滤器可以用来表达以下SQL查询

 SELECT COUNT(*) AS 'Count' FROM `table` WHERE `outlaw` IN ('Good', 'Bad', 'Ugly')

In过滤器的语法如下

{
   "type": "in",
   "dimension": "outlaw",
   "values": ["Good", "Bad", "Ugly"]
}

In过滤器支持使用提取函数详情可见 带提取函数的过滤器

如果一个空的values传给了In过滤器则简单的返回一个空的结果。 如果 dimension为多值维度,则当维度中的一个值在 values数组中时In过滤器将返回true

Like过滤器

Like过滤器被用于基本的通配符搜索等价于SQL中的LIKE语句。 特定的符号支持"%"(匹配任意数量的字符)和"_"(匹配任意单个字符)

属性 类型 描述 是否必须
type String 该值始终为fragment
dimension String 需要过滤的维度
pattern String LIKE模式 例如"foo%"或者"__bar"
escape String 可以用来转义特殊字符的转义符号
extractionFn 提取函数 对维度使用的 提取函数

Like过滤器支持使用提取函数详情可见 带提取函数的过滤器

下边的Like过滤器表达了条件 last_name LIKE "D%", 即: last_name以D开头

{
    "type": "like",
    "dimension": "last_name",
    "pattern": "D%"
}

边界过滤器(Bound Filter)

边界过滤器可以过滤一定范围内的维度值, 它可以用来比较大于、小于、大于等于、小于等于等

属性 类型 描述 是否必须
type String 该值始终为fragment
dimension String 需要过滤的维度
lower String 边界过滤的下边界
upper String 边界过滤的上边界
lowerStrict Boolean 下边界严格比较, 是">"而非">=" 默认为false
upperStrict Boolean 上边界严格比较,是"<"而非"<=" 默认为false
ordering String 指定将值与边界进行比较时要使用的排序顺序。值可以为以下值之一:"lexicographic", "alphanumeric", "numeric", "strlen", "version"。 详情可以查看 Sorting-Orders 否,默认为"lexicographic"
extractionFn 提取函数 对维度使用的 提取函数

边界过滤器支持使用提取函数,详情可见 带提取函数的过滤器

以下边界过滤器表达式指的是 21 <= age <= 31:

{
    "type": "bound",
    "dimension": "age",
    "lower": "21",
    "upper": "31" ,
    "ordering": "numeric"
}

以下表达式表达的是 foo <= name <= hoo, 使用默认的排序方式:

{
    "type": "bound",
    "dimension": "name",
    "lower": "foo",
    "upper": "hoo"
}

使用严格边界,以下表达式表示 21 < age < 31:

{
    "type": "bound",
    "dimension": "age",
    "lower": "21",
    "lowerStrict": true,
    "upper": "31" ,
    "upperStrict": true,
    "ordering": "numeric"
}

以下表达式表示了一个单一边界,表示 age < 31:

{
    "type": "bound",
    "dimension": "age",
    "upper": "31" ,
    "upperStrict": true,
    "ordering": "numeric"
}

相反,以下表达式表示 age >= 18:

{
    "type": "bound",
    "dimension": "age",
    "lower": "18" ,
    "ordering": "numeric"
}

带提取函数的过滤器