1
1
[[combining-filters]]
2
2
=== 组合过滤器
3
3
4
- 前面的两个例子都是单个过滤器(filter)的使用方式。((("structured search", "combining filters")))((("filters", "combining"))) 在实际应用中,我们
5
- 很有可能会过滤多个值或字段。比方说,怎样
6
- 用 Elasticsearch 来表达下面的 SQL ?
4
+ 前面的两个例子都是单个过滤器(filter)的使用方式。((("structured search", "combining filters")))((("filters", "combining"))) 在实际应用中,我们很有可能会过滤多个值或字段。比方说,怎样用 Elasticsearch 来表达下面的 SQL ?
7
5
8
6
[source,sql]
9
7
--------------------------------------------------
@@ -13,14 +11,12 @@ WHERE (price = 20 OR productID = "XHDK-A-1293-#fJ3")
13
11
AND (price != 30)
14
12
--------------------------------------------------
15
13
16
- 这种情况下,我们需要 `bool` (布尔)过滤器。((("filters", "combining", "in bool filter")))((("bool filter"))) 这是个 _复合过滤器(compound filter)_ ,
17
- 它可以接受多个其他过滤器作为参数,并将这些过滤器结合构成各式各样的
18
- 布尔(逻辑)组合。
14
+ 这种情况下,我们需要 `bool` (布尔)过滤器。((("filters", "combining", "in bool filter")))((("bool filter"))) 这是个 _复合过滤器(compound filter)_ ,它可以接受多个其他过滤器作为参数,并将这些过滤器结合成各式各样的布尔(逻辑)组合。
19
15
20
16
[[bool-filter]]
21
17
==== 布尔过滤器
22
18
23
- 一个 `bool` 过滤器由三部分组成:
19
+ 一个 `bool` 过滤器由三部分组成:
24
20
25
21
[source,js]
26
22
--------------------------------------------------
@@ -42,18 +38,14 @@ WHERE (price = 20 OR productID = "XHDK-A-1293-#fJ3")
42
38
`should`::
43
39
至少有一个语句要匹配,与 `OR` 等价。
44
40
45
- 就这么简单!((("should clause", "in bool filters")))((("must_not clause", "in bool filters")))((("must clause", "in bool filters"))) 当我们需要多个过滤器时,只须将它们置入
46
- `bool` 过滤器的不同部分即可。
41
+ 就这么简单!((("should clause", "in bool filters")))((("must_not clause", "in bool filters")))((("must clause", "in bool filters"))) 当我们需要多个过滤器时,只须将它们置入 `bool` 过滤器的不同部分即可。
47
42
48
43
[NOTE]
49
44
====
50
- 一个 `bool` 过滤器的每个部分都是可选的(例如,我们可以只有一个 `must` 语句),
51
- 而且每个部分内部可以只有一个或一组过滤器。
45
+ 一个 `bool` 过滤器的每个部分都是可选的(例如,我们可以只有一个 `must` 语句),而且每个部分内部可以只有一个或一组过滤器。
52
46
====
53
47
54
- 用 Elasticsearch 来表示本部分开始处的 SQL 例子,将两个 `term` 过滤器
55
- 置入 `bool` 过滤器的 `should` 语句
56
- 内,再增加一个语句处理 `NOT` (非)的条件:
48
+ 用 Elasticsearch 来表示本部分开始处的 SQL 例子,将两个 `term` 过滤器置入 `bool` 过滤器的 `should` 语句内,再增加一个语句处理 `NOT` 非的条件:
57
49
58
50
[source,js]
59
51
--------------------------------------------------
@@ -79,13 +71,10 @@ GET /my_store/products/_search
79
71
// SENSE: 080_Structured_Search/10_Bool_filter.json
80
72
81
73
<1> 注意,我们仍然需要一个 `filtered` 查询将所有的东西包起来。
82
- <2> 在 `should` 语句块里面的两个 `term` 过滤器
83
- 与 `bool` 过滤器是父子关系,两个 `term` 条件需要匹配其一。
84
- <3> 如果一个产品的价格是 `30` ,那么它会自动被排除,因为它
85
- 处于 `must_not` 语句里面。
74
+ <2> 在 `should` 语句块里面的两个 `term` 过滤器与 `bool` 过滤器是父子关系,两个 `term` 条件需要匹配其一。
75
+ <3> 如果一个产品的价格是 `30` ,那么它会自动被排除,因为它处于 `must_not` 语句里面。
86
76
87
- 我们搜索的结果返回了 2 个命中结果,两个文档分别匹配了 `bool` 过滤器
88
- 其中的一个条件:
77
+ 我们搜索的结果返回了 2 个命中结果,两个文档分别匹配了 `bool` 过滤器其中的一个条件:
89
78
90
79
[source,json]
91
80
--------------------------------------------------
@@ -113,10 +102,7 @@ GET /my_store/products/_search
113
102
114
103
==== 嵌套布尔过滤器
115
104
116
- 尽管 `bool` 是一个复合的过滤器,可以接受多个子过滤器,需要
117
- 注意的是 `bool` 过滤器本身仍然还只是一个过滤器。((("filters", "combining", "nesting bool filters")))((("bool filter", "nesting in another bool filter"))) 这意味着我们
118
- 可以将一个 `bool` 过滤器置于其他 `bool` 过滤器内部,这为我们
119
- 提供了对任意复杂布尔逻辑进行处理的能力。
105
+ 尽管 `bool` 是一个复合的过滤器,可以接受多个子过滤器,需要注意的是 `bool` 过滤器本身仍然还只是一个过滤器。((("filters", "combining", "nesting bool filters")))((("bool filter", "nesting in another bool filter"))) 这意味着我们可以将一个 `bool` 过滤器置于其他 `bool` 过滤器内部,这为我们提供了对任意复杂布尔逻辑进行处理的能力。
120
106
121
107
对于以下这个 SQL 语句:
122
108
@@ -156,10 +142,8 @@ GET /my_store/products/_search
156
142
--------------------------------------------------
157
143
// SENSE: 080_Structured_Search/10_Bool_filter.json
158
144
159
- <1> 因为 `term` 和 `bool` 过滤器是兄弟关系,他们都处于外层的
160
- 布尔逻辑 `should` 的内部,返回的命中文档至少须匹配其中一个过滤器的条件。
161
- <2> 这两个 `term` 语句作为兄弟关系,同时处于 `must` 语句之中,所以
162
- 返回的命中文档要必须都能同时匹配这两个条件。
145
+ <1> 因为 `term` 和 `bool` 过滤器是兄弟关系,他们都处于外层的布尔逻辑 `should` 的内部,返回的命中文档至少须匹配其中一个过滤器的条件。
146
+ <2> 这两个 `term` 语句作为兄弟关系,同时处于 `must` 语句之中,所以返回的命中文档要必须都能同时匹配这两个条件。
163
147
164
148
得到的结果有两个文档,它们各匹配 `should` 语句中的一个条件:
165
149
@@ -187,5 +171,4 @@ GET /my_store/products/_search
187
171
<1> 这个 `productID` 与外层的 `bool` 过滤器 `should` 里的唯一一个 `term` 匹配。
188
172
<2> 这两个字段与嵌套的 `bool` 过滤器 `must` 里的两个 `term` 匹配。
189
173
190
- 这只是个简单的例子,但足以展示布尔过滤器可以
191
- 用来作为构造复杂逻辑条件的基本构建模块。
174
+ 这只是个简单的例子,但足以展示布尔过滤器可以用来作为构造复杂逻辑条件的基本构建模块。
0 commit comments