在ElasticSearch Query中组合must_not

kcm*_*kcm 10 elasticsearch

我目前正在努力使用目前看起来如下的ElastSearch查询:

...
"query": {
    "bool": {
        "must_not": [
            {
                "term": {
                    "bool-facet.criteria1": {
                        "value": false
                    }
                }
            },
            {
                "term": {
                    "bool-facet.criteria2": {
                        "value": false
                    }
                }
            }
        ]
    }
}
...
Run Code Online (Sandbox Code Playgroud)

所以现在当criteria1或criteria2匹配时,文档将被忽略.查询必须如何,以便只忽略与criteria1 AND criteria2匹配的文档?

pic*_*ypg 8

如果您想要简单的AND-behavior,则只需在其中嵌套另一个bool查询即可:

"query": {
  "bool": {
    "must_not": [
      {
        "bool": {
          "filter": [
            {
              "term": {
                "bool-facet.criteria1": false
              }
            },
            {
              "term": {
                "bool-facet.criteria2": false
              }
            }
          ]
        }
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,通过使用filter(因为是是/否问题,不需要评分,但是如果您想评分,则可以使用must代替filter),从而得到所需的AND行为。这将问题更改为“否(任何具有criteria1 == false和criteria2 == false的文档)”。

  • 在 5.5.1 中,这不起作用。它没有给我错误,但我在结果中看到了应该被“must_not”过滤掉的文档。 (2认同)

Mne*_*quo 8

以下安排对我在5.5.1中的类似查询起作用:

"query": {
    "bool": {
        "must": [
            {
                "bool":{
                    "must_not":{
                        "term":{
                            "bool-facet.criteria1": false
                        }
                    }
                }
            },
            {
                "bool":{
                    "must_not":{
                        "term":{
                            "bool-facet.criteria2": true
                        }
                    }
                }
            }
        ]
    }
} 
Run Code Online (Sandbox Code Playgroud)

对于其他版本,其他答案可能是正确的,但在5.5.1中对我不起作用.


kcm*_*kcm 6

由于无法更新 elasticsearch 版本,我不得不寻找另一个解决方案。这对我有用:

"query": {
    "bool": {
        "must_not" : [
            {
                "query": {
                    "bool": {
                        "must": [
                            {
                               "term": {
                                 "bool-facet.criteria1": false
                               }
                            },
                            {
                               "term": {
                                 "bool-facet.criteria2": false
                               }
                            }
                        ]
                    }
                }
            }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)