Elasticsearch bool查询

时间:2017-04-21 08:20:15

标签: elasticsearch boolean

我在这里关注指南https://dzone.com/articles/23-useful-elasticsearch-example-queries,下面的bool查询让我困惑:

{
    "query": {
        "bool": {
            "must": {
                "bool" : { "should": [
                      { "match": { "title": "Elasticsearch" }},
                      { "match": { "title": "Solr" }} ] }
            },
            "must": { "match": { "authors": "clinton gormely" }},
            "must_not": { "match": {"authors": "radu gheorge" }}
        }
    }
}

根据教程,查询的解释是:

  

在标题中搜索带有“Elasticsearch”或“Solr”字样的图书,   AND由“clinton gormley”撰写,但不是由“radu”撰写的   gheorge”

我的问题是,在bool查询中有3个条件但也有3个逻辑运算符(必须,必须,must_not)而不是2.我的理解是3个条件应该只有2个逻辑运算符,如COND1 AND COND2 AND !COND3

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

该查询错误且不起作用,不可能有两个bool/must子句,它们必须合并如下:

{
  "query": {
    "bool": {
      "must": [
        {
          "bool": {
            "should": [
              {
                "match": {
                  "title": "Elasticsearch"
                }
              },
              {
                "match": {
                  "title": "Solr"
                }
              }
            ]
          }
        },
        {
          "match": {
            "authors": "clinton gormley"
          }
        }
      ],
      "must_not": {
        "match": {
          "authors": "radu gheorge"
        }
      }
    }
  }
}

bool/should条款埋在bool/must内的原因是authors上的匹配比title上的两个匹配更重要