bool 过滤器查询 - 自定义逻辑

时间:2021-02-14 14:09:41

标签: elasticsearch querydsl elasticsearch-5

我正在尝试实现一个过滤条件,其中我正在读取一个布尔标志 =electric_flag

下面是我试图实现的逻辑

if electric_flag = False --> include records which have Flag = False
if electric_flag = True --> include records which have Flag = True or False

我尝试了以下逻辑,但似乎无法正常工作

body = {
    "from": 0,
    "size": 5,
    "explain": False,
    "track_scores": True,
    "_source": [
        "name",
        "id",
        "electric_flag"
    ],
    "query": {
        "bool": {
            "should": [
                {
                    "term": {
                        "name.exact": {
                            "value": search_term,
                            "boost": 100
                        }
                    }
                },
                {
                    "match": {
                        "name": {
                            "query": search_term,
                            "operator": "and",
                            "boost": 80
                        }
                    }
                },
                {
                    "match_phrase": {
                        "name": {
                            "query": search_term,
                            "slop": 1,
                            "boost": 70
                        }
                    }
                },
                {
                    "match": {
                        "name": {
                            "query": search_term,
                            "boost": 10000
                        }
                    }
                },


            ],
            "minimum_should_match": 1,
            "filter": {
                "bool": {
                    "should": [
                        {
                            "term":{
                                "electric_car": False
                            }
                            
                        }
                    ],
                    "should": [
                        {
                            "term":{
                                "electric_car": {{ electric_flag }}
                            }
                            
                        }
                        
                    ],
                    
                }
            }
        }
    },
    "sort": [
        "_score"
    ]
}

在第一个过滤器中应该 --> 我总是将标志设置为 False,在第二个过滤器中我应该读取从应用程序传递给查询的输入标志。但它现在可以正常工作,因为它不能满足我的第一个用例。 有没有一种简单的方法可以在过滤器查询中实现这种条件逻辑?

1 个答案:

答案 0 :(得分:1)

您可以使用简单的 script query

{
  "from": 0,
  "size": 5,
  "explain": False,
  "track_scores": True,
  "_source": [
    "name",
    "id",
    "electric_flag"
  ],
  "query": {
    "bool": {
      ...
      "filter": [
        {
          "script": {
            "script": {
              "source": "!params.electric_flag ? doc['electric_car'].value == false : true",
              "lang": "painless",
              "params": {
                "electric_flag": False
              }
            }
          }
        }
      ]
    }
  },
  "sort": [
    "_score"
  ]
}