Elasticsearch
定义了一套查询DSL
,当我们把Elasticsearch
当数据库使用时,需要用到其 bool
查询,如
{
"query": {
"bool": {
"must": [
{
"match": {
"field_1": {
"query": "1",
"type": "phrase"
}
}
},
{
"match": {
"field_2": {
"query": "2",
"type": "phrase"
}
}
},
{
"match": {
"field_3": {
"query": "3",
"type": "phrase"
}
}
},
{
"match": {
"field_4": {
"query": "4",
"type": "phrase"
}
}
}
]
}
},
"from": 0,
"size": 1
}
看起来比较麻烦,但表达的意思很简单:
if field_1 == 1 && field_2 == 2 && field_3 == 3 && field_4 == 4 {
return true
}
用 bool should query 可以表示 or 的逻辑:
{
"query": {
"bool": {
"should": [
{
"match": {
"field_1": {
"query": "1",
"type": "phrase"
}
}
},
{
"match": {
"field_2": {
"query": "3",
"type": "phrase"
}
}
}
]
}
},
"from": 0,
"size": 1
}
这里表示的是类似:
if field_1 == 1 || field_2 == 2 {
return true
}
这些 Go 代码里 if 后面跟着的表达式在编程语言中有专有名词来表达Boolean Expression:
4 > 1
5 == 2
3 < i && x > 10
Elasticsearch
的Bool Query
方案,就是用json
来表达了这种程序语言中的 Boolean Expression
,为什么可以这么做呢?因为json
本身是可以表达树形结构的,程序代码在被编绎器parse
后,也会变成 AST
,而 AST 抽象语法树就是树形结构。理论上 json 能够完备地表达一段程序代码被 parse 之后的结果。这里的Boolean Expression
被编绎器 parse 后也会生成差不多的树形结构,而且只是整个编绎器实现的一个很小的子集。
最后编辑: kuteng 文档更新时间: 2022-03-22 19:29 作者:kuteng