【问题标题】:bool filter query - custom logicbool 过滤器查询 - 自定义逻辑
【发布时间】:2021-05-17 15:25:04
【问题描述】:

我正在尝试实现一个过滤条件,我正在读取一个布尔标志 =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,在第二个过滤器中我应该读取从应用程序传递给查询的输入标志。但它现在可以正常工作,但不能满足我的第一个用例。 有没有简单的方法在过滤查询中实现这个条件逻辑?

【问题讨论】:

    标签: elasticsearch querydsl elasticsearch-5


    【解决方案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"
      ]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 2016-09-11
      • 2020-08-15
      • 1970-01-01
      • 2012-01-06
      • 2016-08-31
      相关资源
      最近更新 更多