ElasticSearch bool should_not过滤

时间:2016-01-28 12:19:08

标签: elasticsearch boolean range

我是弹性搜索的新手,所以我的例子是:

bool过滤器中有3个部分:

must
    All of these clauses must match. The equivalent of AND. 
must_not
    All of these clauses must not match. The equivalent of NOT. 
should
    At least one of these clauses must match. The equivalent of OR. 

如何预先形成一个should_not查询?

提前致谢:)

4 个答案:

答案 0 :(得分:10)

为了获得类似" should_not"请尝试以下查询:

GET /bank/account/_search
{
   "size": 2000,
   "query": {
      "bool": {
          "must": {
             "match_all": {}
          }, 
         "should": {
            "bool": {
               "must_not": {
                  "match": {
                     "city": "XYZ"
                  }
               }
            }
         }
      }
   }
}

在这种情况下,条款"必须"需要检索所有结果(结果与城市" XYZ"也),但该特定结果的分数降低。

答案 1 :(得分:5)

这取决于你究竟想要一个" should_not"发挥作用。

由于should大致相当于布尔OR(即返回A或B或C为真的文档),因此有一种方法可以考虑" should_not"大致相当于 NOT(A OR B或C)。在布尔逻辑中,这与NOT A AND NOT B和NOT C相同。在这种情况下," should_not"只需将所有子句添加到bool过滤器的must_not部分即可完成行为。

答案 2 :(得分:0)

您可以应用not过滤器,然后应该过滤should_not operation。

  "filter": {
       "not": {
          "filter": {
              "bool": {
                  "should": [
                     {}
                  ]
              }
          }
       }
   }

答案 3 :(得分:0)

此查询类似于sql 其中categoryId =“ category123” AND(localeId!=“ de_DE”或productId!=“ productMediatest-productid01”)

{
  "query": {
   "bool": {
  "must": [
    {
      "term": {
        "categoryId": "category123"
      }
    },
    {
      "bool": {
        "should": [
          {
            "bool": {
              "must_not": {
                "term": {
                  "localeId": "de_DE"
                }
              }
            }
          },
          {
            "bool": {
              "must_not": {
                "term": {
                  "productId": "productMediatest-productid01"
                }
              }
            }
          }
        ]
      }
    }
  ]
}
}
}