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

问题描述

我正在尝试实现一个过滤条件,其中我正在读取一个布尔标志 =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
                        }
                    }
                },"boost": 10000
                        }
                    }
                },],"minimum_should_match": 1,"filter": {
                "bool": {
                    "should": [
                        {
                            "term":{
                                "electric_car": False
                            }
                            
                        }
                    ],"should": [
                        {
                            "term":{
                                "electric_car": {{ electric_flag }}
                            }
                            
                        }
                        
                    ],}
            }
        }
    },"sort": [
        "_score"
    ]
}

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

解决方法

您可以使用简单的 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"
  ]
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...