美文网首页
怎么写ES or查询的query?

怎么写ES or查询的query?

作者: yandaxin | 来源:发表于2020-08-24 13:12 被阅读0次

    百度es的or查询,大多数的博客会告诉你用should,但是should应该加在哪儿,有很多的谬误,导致query和实际查询语义不一样。

    例如实现"name"=="a" and ("city" == "b" or "city" == "c"),是不是以为这样就可以?

     {
        "query": {
            "bool": {
                "must": [{
                    "match_phrase": {
                        "name": "a"
                    }
                }],
                "should": [{
                    "match_phrase": {
                        "city": "b"
                    }
                },
                {
                    "match_phrase": {
                        "city": "c"
                    }
                }]
            }
        }
    }
    

    是不可以的,当must和should同级时,should只影响评分_score,而不具备过滤功能,查询结果见图1,city=='d'的doc也返回了,只不过评分低一些。


    图1

    怎么办呢?有两种解决方案。

    1、将should放到must中,表示or条件必须成立,像这样,看图2,结果和我们语义是一致的。
    {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "name": "a"
              }
            },
            {
              "bool": {
                "should": [
                  {
                    "term": {
                      "city": "b"
                    }
                  },
                  {
                    "term": {
                      "city": "c"
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
    
    图2
    2、指定 "minimum_should_match"。
    图3

    扩展.
    等价于 year==2020 and learn_season in (2,20,21,22,...) and main_grade in (1,2,3) and lesson_stop_time >=1598244100 and lesson_assistant_status ==1 and (assistant_preclass_live_duration > 0 or assistant_postclass_live_duration > 0)

    {
      "index": "idl_assistant_lesson_all_action",
      "type": "_doc",
      "query": {
        "bool": {
          "filter": [
            {
              "term": {
                "year": 2020
              }
            },
            {
              "terms": {
                "learn_season": [
                  "2",
                  "20",
                  "21",
                  "22",
                  "23",
                  "24",
                  "25",
                  "26",
                  "27",
                  "28",
                  "29",
                  "210",
                  "211",
                  "212",
                  "213",
                  "214",
                  "215"
                ]
              }
            },
            {
              "terms": {
                "main_grade": [
                  "2",
                  "3",
                  "4"
                ]
              }
            },
            {
              "terms": {
                "main_subject": [
                  "1",
                  "2",
                  "3"
                ]
              }
            },
            {
              "range": {
                "lesson_stop_time": {
                  "lte": "1598244100"
                }
              }
            },
            {
              "term": {
                "lesson_assistant_status": 1
              }
            },
            {
              "bool": {
                "should": [
                  {
                    "range": {
                      "assistant_preclass_live_duration": {
                        "gt": "0"
                      }
                    }
                  },
                  {
                    "range": {
                      "assistant_postclass_live_duration": {
                        "gt": "0"
                      }
                    }
                  }
                ]
              }
            }
          ]
        }
      },
      "_source": {
        "includes": [
          "course_id",
          "course_name",
          "lesson_id",
          "lesson_name",
          "assistant_uid",
          "lesson_start_time",
          "lesson_stop_time"
        ]
      },
      "sort": [
        {
          "lesson_start_time": {
            "order": "desc"
          }
        },
        {
          "lesson_id": {
            "order": "asc"
          }
        },
        {
          "assistant_uid": {
            "order": "asc"
          }
        }
      ],
      "from": 0,
      "size": 20,
      "search_after": [
        "1598232600",
        "368801",
        "2366998326"
      ]
    }
    

    扩展之又.
    or 查询中有不等于怎么办?百度会告诉你 用must_not,
    例如 city== a or city != c,ES 不支持不等于运算符, must_not是和bool同级使用的,怎么办呢?

    转变思路,city != c 是不是就是等价于 city > c or city < c,query就可以这么写。

    {
      "query": {
        "bool": {
          "must": [
            {
              "bool": {
                "should": [
                  {
                    "term": {
                      "city": "a"
                    }
                  },
                  {
                    "range": {
                      "city": {
                        "lt": "c"
                      }
                    }
                  },
                  {
                    "range": {
                      "city": {
                        "gt": "c"
                      }
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
    
    图4

    that's all,enjoy~

    相关文章

      网友评论

          本文标题:怎么写ES or查询的query?

          本文链接:https://www.haomeiwen.com/subject/zgogjktx.html