在ElasticSearch查询中组合must_not

问题描述 投票:0回答:5

我目前正在努力处理 ElastSearch 查询,目前看起来如下:

...
"query": {
    "bool": {
        "must_not": [
            {
                "term": {
                    "bool-facet.criteria1": {
                        "value": false
                    }
                }
            },
            {
                "term": {
                    "bool-facet.criteria2": {
                        "value": false
                    }
                }
            }
        ]
    }
}
...

所以现在当 criteria1 或 criteria2 匹配时,文档将被忽略。查询必须是什么样子,以便只有匹配 criteria1 和 criteria2 的文档才会被忽略?

elasticsearch
5个回答
36
投票

如果您想要简单的

AND
行为,那么只需在其中嵌套另一个
bool
查询即可:

"query": {
  "bool": {
    "must_not": [
      {
        "bool": {
          "filter": [
            {
              "term": {
                "bool-facet.criteria1": false
              }
            },
            {
              "term": {
                "bool-facet.criteria2": false
              }
            }
          ]
        }
      }
    ]
  }
}

请注意,通过使用

filter
(因为这是一个是/否问题,不需要评分,但如果您想要评分,那么您可以使用
must
而不是
filter
),您将获得所需的
AND
行为。这会将问题更改为“不(任何具有 criteria1 == false AND criteria2 == false 的文档)”。


17
投票

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

"query": {
    "bool": {
        "must": [
            {
                "bool":{
                    "must_not":{
                        "term":{
                            "bool-facet.criteria1": false
                        }
                    }
                }
            },
            {
                "bool":{
                    "must_not":{
                        "term":{
                            "bool-facet.criteria2": true
                        }
                    }
                }
            }
        ]
    }
} 

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


6
投票

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

"query": {
    "bool": {
        "must_not" : [
            {
                "query": {
                    "bool": {
                        "must": [
                            {
                               "term": {
                                 "bool-facet.criteria1": false
                               }
                            },
                            {
                               "term": {
                                 "bool-facet.criteria2": false
                               }
                            }
                        ]
                    }
                }
            }
        ]
    }
}

2
投票

这种行为在

6.5.4
下对我有用:

GET model/_search
{
    "query": {
        "bool": {
            "must_not": [
                {
                    "exists": {
                        "field": "field1"
                    }
                },
                {
                    "exists": {
                        "field": "field2"
                    }
                },
                {
                    "exists": {
                        "field": "field3"
                    }
                }
            ]
        }
    }
}

0
投票

这对我有用:

GET index/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "bool": {
            "must": [
              {
                "term": {
                  "bool-facet.criteria1": false
                }
              },
              {
                "term": {
                  "bool-facet.criteria2": false
                }
              }
            ]
          }
        }
      ]
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.