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

ElasticsearchBool Query方案,就是用json 来表达了这种程序语言中的 Boolean Expression,为什么可以这么做呢?因为json本身是可以表达树形结构的,程序代码在被编绎器parse 后,也会变成 AST,而 AST 抽象语法树就是树形结构。理论上 json 能够完备地表达一段程序代码被 parse 之后的结果。这里的Boolean Expression 被编绎器 parse 后也会生成差不多的树形结构,而且只是整个编绎器实现的一个很小的子集。

最后编辑: kuteng  文档更新时间: 2022-03-22 19:29   作者:kuteng