1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-29 08:12:21 +00:00

update dse

This commit is contained in:
Xargin 2018-07-11 12:23:04 +08:00
parent e738ff80a1
commit 06a83792be

View File

@ -91,7 +91,7 @@ func equal() {
### 查询 DSL
es 定义了一套查询 DSL当我们把 es 当数据库使用时,需要用到其 bool 逻辑。举个例子:
es 定义了一套查询 DSL当我们把 es 当数据库使用时,需要用到其 bool 查询。举个例子:
```json
{
@ -136,4 +136,63 @@ es 定义了一套查询 DSL当我们把 es 当数据库使用时,需要用
"from": 0,
"size": 1
}
```
```
看起来比较麻烦,但表达的意思很简单:
```go
if field_1 == 1 && field_2 == 2 && field_3 == 3 && field_4 == 4 {
return true
}
```
用 bool should query 可以表示 or 的逻辑:
```json
{
"query": {
"bool": {
"should": [
{
"match": {
"field_1": {
"query": "1",
"type": "phrase"
}
}
},
{
"match": {
"field_2": {
"query": "3",
"type": "phrase"
}
}
}
]
}
},
"from": 0,
"size": 1
}
```
这里表示的是类似:
```go
if field_1 == 1 || field_2 == 2 {
return true
}
```
这些 Go 代码里 if 后面跟着的表达式在编程语言中有专有名词来表达 Boolean Expression
```go
4 > 1
5 == 2
3 < i && x > 10
```
es 的 Bool Query 方案,实际上就是用 json 来表达了这种程序语言中的 Boolean Expression为什么可以这么做呢因为 json 本身是可以表达树形结构的,我们的程序代码在被编译器 parse 之后,也会变成 AST而 AST 抽象语法树,顾名思义,就是树形结构。理论上 json 能够完备地表达一段程序代码被 parse 之后的结果。这里的 Boolean Expression 被编译器 Parse 之后也会生成差不多的树形结构,而且只是整个编译器实现的一个很小的子集。
TODOast 和 bool query 结构对比图