bool 过滤器查询 - 自定义逻辑
bool filter query - custom logic
我正在尝试实现一个过滤条件,我正在读取一个布尔标志 = 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,在第二个过滤器中我应该读取从应用程序传递给查询的输入标志。但它现在确实可以工作,因为它不应该满足我的第一个用例。
有没有一种简单的方法可以在过滤器查询中实现这个条件逻辑?
您可以使用简单的 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"
]
}
我正在尝试实现一个过滤条件,我正在读取一个布尔标志 = 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,在第二个过滤器中我应该读取从应用程序传递给查询的输入标志。但它现在确实可以工作,因为它不应该满足我的第一个用例。 有没有一种简单的方法可以在过滤器查询中实现这个条件逻辑?
您可以使用简单的 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"
]
}