问题描述
我正在尝试实现一个过滤条件,其中我正在读取一个布尔标志 =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"
]
}